Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 2, 2010 14:30:07

mr. Sum
От:
Зарегистрирован: 2010-11-27
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy последнее найденное значение.

Всем привет.

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

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

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

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

Благодарю.



Офлайн

#2 Дек. 2, 2010 14:43:42

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

SQLAlchemy последнее найденное значение.

А как вы получаете последнее значение на “просто SQL запросе?”



Офлайн

#3 Дек. 2, 2010 15:16:15

mr. Sum
От:
Зарегистрирован: 2010-11-27
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy последнее найденное значение.

Я не знаю чистый SQL, поэтому на этот вопрос ответить не могу

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

SELECT * FROM table ORDER BY id DESC LIMIT 0,1



Отредактировано (Дек. 2, 2010 15:17:55)

Офлайн

#4 Дек. 2, 2010 16:54:29

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

SQLAlchemy последнее найденное значение.

Алхимия не избавляет от знания SQL - придется таки выучить.
sess = session.query(Some_Class).filter(Some_Class.id_n==id_m).order_by(desc(Some_Class.id_n)).limit(1).first()



Офлайн

#5 Дек. 2, 2010 17:30:30

mr. Sum
От:
Зарегистрирован: 2010-11-27
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy последнее найденное значение.

Спасибо, большое. Попробовал ваш пример ;)

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

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

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

В чем может быть проблема?



Офлайн

#6 Дек. 2, 2010 17:41:08

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

SQLAlchemy последнее найденное значение.

Не должен быть int - должна быть колонка.
А как вы Some_Class описывали? И как mapper к нему крепили?



Офлайн

#7 Дек. 2, 2010 17:52:54

mr. Sum
От:
Зарегистрирован: 2010-11-27
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy последнее найденное значение.

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:02:08)

Офлайн

#8 Дек. 2, 2010 18:20:30

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

SQLAlchemy последнее найденное значение.

Смотрите пример:

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()
Если непонятно - давайте править его и выяснять, что же вам нужно



Офлайн

#9 Дек. 2, 2010 18:35:54

mr. Sum
От:
Зарегистрирован: 2010-11-27
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy последнее найденное значение.

Есть база. В ней есть две таблицы.

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

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()



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version