Найти - Пользователи
Полная версия: SQLAlchemy последнее найденное значение.
Начало » Базы данных » SQLAlchemy последнее найденное значение.
1
mr. Sum
Всем привет.

Такой вопрос. Каким образом при помощи SQLAlchemy, можно вытянуть последнее найденное значение в таблице.

Например, вот так можно вытянуть первое значение:

sess = session.query(Some_Class).filter_by(id_n=id_m).first()

Как таким же образом можно вытянуть но последнее значение. В документации, если честно не нашел ;)

Благодарю.
Андрей Светлов
А как вы получаете последнее значение на “просто SQL запросе?”
mr. Sum
Я не знаю чистый SQL, поэтому на этот вопрос ответить не могу

Я думаю, как-нибудь так.

SELECT * FROM table ORDER BY id DESC LIMIT 0,1
Андрей Светлов
Алхимия не избавляет от знания SQL - придется таки выучить.
sess = session.query(Some_Class).filter(Some_Class.id_n==id_m).order_by(desc(Some_Class.id_n)).limit(1).first()
mr. Sum
Спасибо, большое. Попробовал ваш пример ;)

Получил следующую ошибку:

“sqlalchemy.exc.ArgumentError: filter() argument must be of type sqlalchemy.sql.ClauseElement or string”

Some_Class.id_n - тип integer
id_m - тип интегер

В чем может быть проблема?
Андрей Светлов
Не должен быть int - должна быть колонка.
А как вы Some_Class описывали? И как mapper к нему крепили?
mr. Sum
Class Some_Class(Base):
__tablename__= ‘name123’
id_n = Column(Integer, primary_key=True)
date = Column(date)

def __init__(self, date):
self.date = date

id_m, это тоже id но уже из другой таблицы, для нее я создал отдельный класс. И практически так же его описал.

сессию, создаю вот так.

sess = Session()
someclass = session.query(Some_Class).filter(Some_Class.id_n==Other_Class.id_m).order_by(desc(Some_Class.id_n)).limit(1).first()
Андрей Светлов
Смотрите пример:
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///:memory:')

Base = declarative_base()

class A(Base):
__tablename__ = 't'

id = Column(Integer, primary_key=True)
name = Column(String(255))

def __init__(self, name):
self.name = name

def __str__(self):
return 'A(%d: %s)' % (self.id, self.name)


Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()
session.add_all([
A('first'),
A('second'),
A('second'), # same as previous but different id
])

session.commit()

q = session.query(A).order_by(desc(A.name)).limit(1)
print q.one()

q = session.query(A).filter(A.name == 'second').order_by(desc(A.id)).limit(1)
print q.one()
Если непонятно - давайте править его и выяснять, что же вам нужно
mr. Sum
Есть база. В ней есть две таблицы.

В таблице А, есть колонки

id_n и date(например)
0 01.11.2010
1 02.11.2010

и т.д.

В таблицы Б есть уже 3 колонки, это

id_m date id_A

При сохранение, каких-то данных в таблицу Б, сохраняется еще id из таблички А, в поле id_A

так как значений, к примеру, с id_A == 2, может быть много. А мне нужно только последнее из с таблицы, то я использую, то что Вы мне посоветали. В результате получаю ошибку, которая выше.

Запрос получается следующий:

someclass = session.query(Some_Class).filter(Some_Class.id_A==Other_Class.id_n).order_by(desc(Some_Class.id_m)).limit(1).first()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB