我在使用带有 PySide(PyQt) 的 SQLAlchemy 时遇到问题。我试图弹出一个QtGui.QDialog
,但是当我这样做时,SQLAlchemy 会抛出一个异常:
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\preo\preodb\dbviewandmodel.py", line 32, in rowCount
return len(self.rows())
File "C:\Python27\lib\site-packages\preo\preodb\dbviewandmodel.py", line 30, in rows
return self.tableobj.query.all()
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\orm\query.py", line 1579, in all
return list(self)
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\orm\query.py", line 1688, in __iter__
self.session._autoflush()
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\orm\session.py", line 862, in _autoflush
self.flush()
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\orm\session.py", line 1388, in flush
self._flush(objects)
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\orm\session.py", line 1469, in _flush
flush_context.execute()
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\orm\unitofwork.py", line 302, in execute
rec.execute(self)
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\orm\unitofwork.py", line 446, in execute
uow
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\orm\mapper.py", line 1878, in _save_obj
execute(statement, params)
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\engine\base.py", line 1191, in execute
params)
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\engine\base.py", line 1271, in _execute_clauseelement
return self.__execute_context(context)
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\engine\base.py", line 1302, in __execute_context
context.parameters[0], context=context)
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\engine\base.py", line 1401, in _cursor_execute
context)
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\engine\base.py", line 1394, in _cursor_execute
context)
File "C:\Python27\lib\site-packages\sqlalchemy-0.6.6-py2.7.egg\sqlalchemy\engine\default.py", line 299, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.IntegrityError: (IntegrityError) ('23000', "[23000] [Microsoft][ODBC
SQL Server Driver][SQL Server]Violation of UNIQUE KEY
constraint 'UQ__users__F3DBC5720DAF0CB0'. Cannot insert duplicate key in
object 'dbo.users'. (2627) (SQLExecDirectW); [01000] [Microsoft][ODBC SQL Server
Driver][SQL Server]The statement has been terminated. (3621)") u'INSERT INTO users
(username, fullname, email, passwordmd5) OUTPUT inserted.id VALUES (?, ?, ?, ?)'
(None, None, None, None)
这尤其令人不安,因为我在任何地方都没有代码,甚至可以尝试将记录插入 SQL;我只是试图从数据库中查询数据。事实上,我的数据库模型对于 PySide/PyQt 正在做的事情是只读的(即,我正在使用QtGui.QTableView
模型/视图,并且该模型中没有insertRows
函数)。
我不知道发生了什么或如何解决它 - 同样,我根本没有修改 SQL 记录的代码,但 SQLAlchemy 仍然尝试将空白记录插入到我的一个 SQL 表中。在后台,我只能看到QTableView
数据模型正在大量查询数据库。似乎当我弹出这个QDialog
(其中确实有一些代码可以查询某个表列)时,会抛出这个错误。奇怪的是,这并不一致,有时弹出窗口首先出现在异常之前,有时弹出窗口出现在异常之后。在正常情况下,QTableView
数据模型工作得很好,只是当我弹出这个对话框时(讽刺的是,弹出窗口根本没有使用任何QTableView
东西,只是像 QLineEdit、QTextEdit 等标准小部件)
如果有帮助,我将 Python 2.7 与 SQLAlchemy 0.6.6(也与 Elixir 0.7.1)和 PySide 1.0.0(和 PyQt4 4.8.3)一起使用。我在使用 SQL 2008 R2 (Express) 的 Windows 7 上。是的,我试过重启电脑,但重启后问题仍然存在。我不愿意发布更多代码,因为我在这个特定项目中有很多代码,而且我无法确定任何具体的问题。
我希望有人可能知道 SQLAlchemy 和/或 PyQt 中可能与此相关的奇怪之处。我也希望我可以继续使用 SQLAlchemy,因为我已经构建了一个大型数据模型;在这一点上,我不愿意放弃这一点并使用 PyQt 的 SQL 功能。