2012-07-22 175 views
1

如何通過PyQt4.QtSql模塊從SQL Server獲取最後插入的行的ID?現在,我使用SQL Server 2012 Express,但計劃也工作SQL Server 2000中如何從SQL Server中通過QSqlQuery.lastInsertId()獲取最後插入的行的ID?

這裏的是我的代碼(Python的+ PyQt的)和結果:

from PyQt4.QtGui import QApplication 
from PyQt4 import QtSql 

app = QApplication([]) 
db = QtSql.QSqlDatabase.addDatabase("QODBC") 
db.setDatabaseName('Driver={SQL Server Native Client 11.0};Server=(localdb)\\v11.0;') 
db.open() 

query = QtSql.QSqlQuery() 
query.prepare("""CREATE TABLE Test(
    ID INT PRIMARY KEY IDENTITY(1, 1), 
    Row nvarchar(255) 
) 
""") 
query.exec_() 

query = QtSql.QSqlQuery() 
query.prepare('INSERT Test OUTPUT Inserted.ID VALUES(?)') 
query.bindValue(0, 'Test') 

query.exec_() 

while query.next(): 
    last_inserted_id = query.value(0) 

print('OUTPUT: ', last_inserted_id) 
print('QSqlQuery.lastInsertId: ', query.lastInsertId()) 

query = QtSql.QSqlQuery('SELECT SCOPE_IDENTITY()') 

while query.next(): 
    last_inserted_id_ = query.value(0) 

print('SCOPE_IDENTITY: ', last_inserted_id_) 

db.close() 

結果:

OUTPUT: 1 
QSqlQuery.lastInsertId: None 
SCOPE_IDENTITY: <PyQt4.QtCore.QPyNullVariant object at 0x00000000032D88D0> 

不幸的是OUTPUT子句受SQL Server 2005或更高版本支持。

的Python 3.2.3(64位),PyQt的4.9.4,SQL Server 2012點中快速

任何想法?

編輯:

到目前爲止我用SELECT @@IDENTITY

+0

曾想過使用例如[SQLAlchemy的](http://www.sqlalchemy.org/)? – dav1d 2012-07-22 15:05:29

+0

@ dav1d SQLAlchemy通過pyodbc支持SQL Server。如果我使用PyQt,我不需要額外的庫。從pyodbc FAQ:「SQL Server還提供了SCOPE_IDENTITY(),它可以解決這個問題。不幸的是,SQL Server ODBC驅動程序會爲每個執行調用調用一個內部存儲過程,從而導致作用域的混亂,從而導致無法使用。」 http://code.google.com/p/pyodbc/wiki/FAQs#SQL_Server – kros 2012-07-22 19:56:03

+1

我不知道Python,但我認爲SCOPE_IDENTITY()只能在批處理內工作。因此,您可能希望使用INSERT將SELECT SCOPE_IDENTITY()添加到查詢中。希望這可以幫助。 – GilM 2012-07-23 05:55:32

回答

2

移動我的評論到的答案,讓這種完全關閉:

我不知道Python,但我認爲SCOPE_IDENTITY()只適用一個批次內。因此,您可能希望使用INSERT將SELECT SCOPE_IDENTITY()添加到查詢中。希望這可以幫助。

所以你插入可能看起來像:

query = QtSql.QSqlQuery() 
query.prepare('INSERT Test VALUES(?); SELECT SCOPE_IDENTITY()') 
query.bindValue(0, 'Test') 

query.exec_() 

while query.next(): 
    last_inserted_id = query.value(0) 
1

QSqlQuery類有一個方法lastInsertId返回最後插入行的ID。

query = QtSql.QSqlQuery() 
query.exec_('INSERT Test (id, name) VALUES(1, 'Test')') 

# Get the ID of the last inserted row 
query.lastInsertId() # Output : 1 
相關問題