Преобразуйте результат session.query в Object - PullRequest
2 голосов
/ 31 января 2012

Я начинаю с SQLAlchemy и пытаюсь получить свою последнюю вставку (твит), но я получаю только SQL-запрос:

conf = readConf("../utils/conf.yaml")
schema = conf['bdd']['type'] + '://' + conf['bdd']['user'] + ':' + conf['bdd']['password'] + '@' + conf['bdd']['host'] + '/' + conf['bdd']['db'] + '?charset=utf8'

engine = create_engine(schema, echo=True)

Base = getBase()
Base.metadata.create_all(engine) 

Session = sessionmaker(bind=engine)
session = Session()
tq = session.query(Tweet).group_by(Tweet.tweet_id_uniq).filter(func.max(Tweet.tweet_id_uniq) == Tweet.tweet_id_uniq)
# tweet_id_uniq is a BIGINT autoincrement, so the highest value is the last Tweet.
print tq

Результатом печати является запрос SQL (для удобства чтения):

SELECT tweets.tweet_id AS tweets_tweet_id, 
       tweets.tweet_id_uniq AS tweets_tweet_id_uniq, 
       tweets.user_id AS tweets_user_id, 
       tweets.user_id_uniq AS tweets_user_id_uniq, 
       tweets.tweet_text AS tweets_tweet_text, 
       tweets.created_at AS tweets_created_at, 
       tweets.in_reply_to AS tweets_in_reply_to, 
       tweets.geo_lat AS tweets_geo_lat, 
       tweets.geo_long AS tweets_geo_long, 
       tweets.screen_name AS tweets_screen_name, 
       tweets.name AS tweets_name, 
       tweets.profile_image_url AS tweets_profile_image_url, 
       tweets.source AS tweets_source 
FROM   tweets 
WHERE  max(tweets.tweet_id_uniq) = tweets.tweet_id_uniq 
GROUP BY tweets.tweet_id_uniq 

Почему я не могу получить твит?

РЕДАКТИРОВАТЬ: Если я добавлю .one () или .fisrt () или .all (), я получу эту ошибку:

2012-01-31 16:05:37,644 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2012-01-31 16:05:37,645 INFO sqlalchemy.engine.base.Engine SELECT tweets.tweet_id AS tweets_tweet_id, tweets.tweet_id_uniq AS tweets_tweet_id_uniq, tweets.user_id AS tweets_user_id, tweets.user_id_uniq AS tweets_user_id_uniq, tweets.tweet_text AS tweets_tweet_text, tweets.created_at AS tweets_created_at, tweets.in_reply_to AS tweets_in_reply_to, tweets.geo_lat AS tweets_geo_lat, tweets.geo_long AS tweets_geo_long, tweets.screen_name AS tweets_screen_name, tweets.name AS tweets_name, tweets.profile_image_url AS tweets_profile_image_url, tweets.source AS tweets_source 
FROM tweets 
WHERE max(tweets.tweet_id_uniq) = tweets.tweet_id_uniq
2012-01-31 16:05:37,645 INFO sqlalchemy.engine.base.Engine ()
...
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.7.3-py2.6-linux-i686.egg/sqlalchemy/engine/default.py", line 330, in do_execute
cursor.execute(statement, parameters)
File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 166, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py", line 35, in defaulterrorhandler
raise errorclass, errorvalue
sqlalchemy.exc.ProgrammingError: (ProgrammingError) (1111, 'Invalid use of group function') 'SELECT tweets.tweet_id AS tweets_tweet_id, tweets.tweet_id_uniq AS tweets_tweet_id_uniq, tweets.user_id AS tweets_user_id, tweets.user_id_uniq AS tweets_user_id_uniq, tweets.tweet_text AS tweets_tweet_text, tweets.created_at AS tweets_created_at, tweets.in_reply_to AS tweets_in_reply_to, tweets.geo_lat AS tweets_geo_lat, tweets.geo_long AS tweets_geo_long, tweets.screen_name AS tweets_screen_name, tweets.name AS tweets_name, tweets.profile_image_url AS tweets_profile_image_url, tweets.source AS tweets_source \nFROM tweets \nWHERE max(tweets.tweet_id_uniq) = tweets.tweet_id_uniq GROUP BY tweets.tweet_id_uniq' ()

Ответы [ 2 ]

2 голосов
/ 31 января 2012

Вы пытаетесь найти наибольшее значение, а затем сгруппировать его. Это значение уникально. Так что вы могли бы просто заказать и получить один.

tq = session.query(Tweet).order_by(desc(Tweet.tweet_id_uniq)).first()

tq теперь ваш Tweet-объект с наибольшим идентификатором.

Кстати, проблема в том, что ваш результирующий запрос неверен. Вы не можете сопоставить максимальное значение со столбцом из этой же таблицы без повторного включения таблицы (что, вероятно, не то, что вы хотите сделать) или использования подзапроса (также неудобно).

1 голос
/ 31 января 2012

Попробуйте: session.query(Tweet).group_by(Tweet.tweet_id_uniq).filter(func.max(Tweet.tweet_id_uniq) == Tweet.tweet_id_uniq).<strong>all()</strong>

или first(), или one().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...