我遇到了一个相当棘手的问题,经过测试后我发现没有可用的答案就足够了。
我已经看到了各种建议,但似乎没有人能够在MySQL中返回auto_increment字段的最后插入值。
我见过一些例子,提到使用session.flush()添加记录然后检索id。然而,似乎总是返回0。
我也看到过提及session.refresh()使用的示例,但会引发以下错误:InvalidRequestError:无法刷新实例''
我想做的事似乎非常简单,但我似乎无法弄清楚这个秘密。
我正在使用声明式方法。
所以,我的代码看起来像这样:
class Foo(Base):
__tablename__ = 'tblfoo'
__table_args__ = {'mysql_engine':'InnoDB'}
ModelID = Column(INTEGER(unsigned=True), default=0, primary_key=True, autoincrement=True)
ModelName = Column(Unicode(255), nullable=True, index=True)
ModelMemo = Column(Unicode(255), nullable=True)
f = Foo(ModelName='Bar', ModelMemo='Foo')
session.add(f)
session.flush()
此时,对象f已被推送到DB,并且已自动分配了唯一的主键ID。但是,我似乎无法找到一种方法来获取在一些额外操作中使用的值。我想做以下事情:
my_new_id = f.ModelID
我知道我可以简单地执行另一个查询来根据其他参数查找ModelID,但我不愿意,如果可能的话。
我非常感谢对这个问题的解决方案的任何见解。
感谢您的帮助。
答案 0 :(得分:9)
问题是您是为自动增量设置defaul
。因此,当它运行插入查询时,服务器的日志是
2011-12-21 13:44:26,561 INFO sqlalchemy.engine.base.Engine.0x...1150 INSERT INTO tblfoo (`ModelID`, `ModelName`, `ModelMemo`) VALUES (%s, %s, %s)
2011-12-21 13:44:26,561 INFO sqlalchemy.engine.base.Engine.0x...1150 (0, 'Bar', 'Foo')
ID : 0
因此,输出为0
,这是默认值,因为您要设置autoincrement
列的默认值,所以会传递该值。
如果我在没有default
的情况下运行相同的代码,那么它会给出正确的输出。
请尝试此代码
from sqlalchemy import create_engine
engine = create_engine('mysql://test:test@localhost/test1', echo=True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
from sqlalchemy import Column, Integer, Unicode
class Foo(Base):
__tablename__ = 'tblfoo'
__table_args__ = {'mysql_engine':'InnoDB'}
ModelID = Column(Integer, primary_key=True, autoincrement=True)
ModelName = Column(Unicode(255), nullable=True, index=True)
ModelMemo = Column(Unicode(255), nullable=True)
Base.metadata.create_all(engine)
f = Foo(ModelName='Bar', ModelMemo='Foo')
session.add(f)
session.flush()
print "ID :", f.ModelID
答案 1 :(得分:2)
尝试使用session.commit()
代替session.flush()
。然后,您可以使用f.ModelID
。
答案 2 :(得分:1)
不确定为什么标记的答案适合您。但就我而言,实际上并没有将行插入表中。我最后需要致电commit()
。
所以最后几行代码是:
f = Foo(ModelName='Bar', ModelMemo='Foo')
session.add(f)
session.flush()
print "ID:", f.ModelID
session.commit()