I start with SQLAlchemy and i try to get my last insert (a Tweet) but i only get the sql query :
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
The print result is the SQL query (wrapped for legibility):
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
Why don’t I retrieve a Tweet ?
EDIT : If I add .one() or .fisrt() or .all(), i get this error :
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' ()
You are trying to match on the greatest value and then group it. That value is unique. So you might as well just order by and get one.
tq is now your Tweet object with the largest id.
Incidentally, the problem is that your resulting query is incorrect sql. You can’t match a max value against a column from that same table without re-including the table (which probably isn’t what you want to do) or using a subquery (also awkward).