6

かなり厄介な問題に出くわしました。テストの結果、利用可能な回答のどれも十分ではないことがわかりました。

さまざまな提案を見てきましたが、MySQL の auto_increment フィールドに最後に挿入された値を返すことができるものはないようです。

session.flush() を使用してレコードを追加し、ID を取得する例を見てきました。ただし、常に 0 を返すようです。

session.refresh() の使用に言及している例も見ましたが、次のエラーが発生します: InvalidRequestError: Could not refresh instance ''

私がやろうとしていることは非常に単純に思えますが、その秘密を理解できないようです.

私は宣言的アプローチを使用しています。

したがって、私のコードは次のようになります。

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 を検索するだけでよいことはわかっていますが、可能であればそうしたくないと思います。

この問題の解決策についての洞察をいただければ幸いです。

事前に助けてくれてありがとう。

4

3 に答える 3

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
于 2011-12-21T08:22:21.370 に答える
2

session.commit()の代わりに使ってみてくださいsession.flush()。を使用できますf.ModelID

于 2011-12-21T05:20:39.633 に答える