mr. Sum
Дек. 2, 2010 14:30:07
Всем привет.
Такой вопрос. Каким образом при помощи SQLAlchemy, можно вытянуть последнее найденное значение в таблице.
Например, вот так можно вытянуть первое значение:
sess = session.query(Some_Class).filter_by(id_n=id_m).first()
Как таким же образом можно вытянуть но последнее значение. В документации, если честно не нашел ;)
Благодарю.
Андрей Светлов
Дек. 2, 2010 14:43:42
А как вы получаете последнее значение на “просто SQL запросе?”
mr. Sum
Дек. 2, 2010 15:16:15
Я не знаю чистый SQL, поэтому на этот вопрос ответить не могу
Я думаю, как-нибудь так.
SELECT * FROM table ORDER BY id DESC LIMIT 0,1
Андрей Светлов
Дек. 2, 2010 16:54:29
Алхимия не избавляет от знания 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
Дек. 2, 2010 17:30:30
Спасибо, большое. Попробовал ваш пример ;)
Получил следующую ошибку:
“sqlalchemy.exc.ArgumentError: filter() argument must be of type sqlalchemy.sql.ClauseElement or string”
Some_Class.id_n - тип integer
id_m - тип интегер
В чем может быть проблема?
Андрей Светлов
Дек. 2, 2010 17:41:08
Не должен быть int - должна быть колонка.
А как вы Some_Class описывали? И как mapper к нему крепили?
mr. Sum
Дек. 2, 2010 17:52:54
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()
Андрей Светлов
Дек. 2, 2010 18:20:30
Смотрите пример:
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
Дек. 2, 2010 18:35:54
Есть база. В ней есть две таблицы.
В таблице А, есть колонки
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()