2011-12-21 67 views
6

我剛纔遇到了一個相當棘手的問題,經過測試,我發現沒有可用的答案就足夠了。使用SQLAlchemy從MySQL獲取最後插入的值

我看過各種建議,但似乎沒有人能夠返回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,已被推到數據庫,並已自動分配一個唯一的主鍵ID。但是,我似乎無法找到一種方法來獲取在一些額外操作中使用的值。我想做到以下幾點:

my_new_id = f.ModelID

我知道我可以簡單地執行另一個查詢基於其它參數來查找ModelID但我寧願不要,如果在所有可能的。

我非常感謝對此問題的解決方案的任何見解。

感謝您的幫助提前。

回答

9

問題是你正在爲自動增量設置defaul。因此,當它運行INSERT INTO查詢服務器的日誌

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:[email protected]/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

很好的捕獲,沒有注意到默認= 0。 – 2011-12-21 11:09:58

+1

服務器日誌將始終工作,以找到問題:) – Nilesh 2011-12-21 11:34:26

+1

呃...是的,很好的接收。我的頭在創建表時需要主鍵字段缺省值的SQL環境中。感謝您的發現。 – PlaidFan 2011-12-22 14:16:53

1

嘗試使用session.commit()而不是session.flush()。然後您可以使用f.ModelID

+0

我嘗試了兩種沖洗後提交,但收到以下錯誤:AttributeError的:「富」對象有沒有屬性「ID」 – PlaidFan 2011-12-21 05:26:10

+0

對不起,更新在您的模式聲明中使用您使用ModelID的答案。不過,你應該使用'id'而不是'ModelID'。 – 2011-12-21 05:27:57

+0

不幸的是,我已經嘗試了很多方法,並繼續得到以下錯誤:ObjectDeletedError:Instance''已被刪除。 – PlaidFan 2011-12-21 05:31:13

1

不知道爲什麼標記答案爲你工作。但在我的情況下,這並不實際將該行插入表中。最後我需要撥打commit()

所以代碼的最後幾行:

f = Foo(ModelName='Bar', ModelMemo='Foo') 
session.add(f) 
session.flush() 

print "ID:", f.ModelID 

session.commit() 
相關問題