如何从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

+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

移动我的评论到的答案,让这种完全关闭:

我不知道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