如何从SQL Server中通过QSqlQuery.lastInsertId()获取最后插入的行的ID?
问题描述:
如何通过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
。
答
移动我的评论到的答案,让这种完全关闭:
我不知道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)
答
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
曾想过使用例如[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