如何通過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
。
曾想過使用例如[SQLAlchemy的](http://www.sqlalchemy.org/)? – dav1d 2012-07-22 15:05:29
@ 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
我不知道Python,但我認爲SCOPE_IDENTITY()只能在批處理內工作。因此,您可能希望使用INSERT將SELECT SCOPE_IDENTITY()添加到查詢中。希望這可以幫助。 – GilM 2012-07-23 05:55:32