我在使用带有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中;我只尝试从数据库中查询数据。事实上,我的DB模型对于PySide/PyQt正在做的事情是只读的(即,我使用的是QtGui.QTableView模型/视图,并且该模型中没有insertRows函数)。
我不知道发生了什么,也不知道如何解决这个问题--再说一次,我根本没有修改SQL记录的代码,但是SQLAlchemy仍然试图在我的SQL表中插入空白记录。在后台,我所能看到的是QTableView数据模型正在大量查询数据库。只是当我弹出这个QDialog (其中确实包含一些代码来查询某些表列)时,似乎就抛出了这个错误。奇怪的是,这并不一致,有时弹出窗口出现在异常之前,有时弹出窗口出现在异常之后。在正常情况下,QTableView数据模型工作得很好,只是当我弹出此对话框时(具有讽刺意味的是,弹出窗口根本没有使用任何QTableView,只使用了QLineEdit、QTextEdit等标准小部件)。
如果有帮助,我使用Python2.7和SQLAlchemy 0.6.6 (也包括Elixir 0.7.1)和PySide 1.0.0 (和PyQt4 4.8.3)。我在Windows7上使用SQL2008Express( R2 )。是的,我已经尝试重新启动电脑,但问题仍然发生在重新启动后。我不愿意发布更多的代码,因为我在这个特定的项目中有很多代码,并且我不能确定任何具体的问题。
我希望有人可能知道SQLAlchemy和/或PyQt中可能与此有关的怪事。我还希望能够继续使用SQLAlchemy,因为我已经构建了一个大型数据模型;在这一点上,我不愿意放弃这一点,转而使用PyQt特性。
发布于 2011-03-17 23:00:30
我已经设法解决了这个问题,但我仍然不清楚为什么SQLAlchemy要在我的数据库中插入行-这真的让我很困扰,但它不会再发生了。
无论如何,我认为发生的事情与我的SQLAlchemy数据模型和我访问它的方式有关,下面是该模型的一个片段:
from elixir import *
metadata.bind = 'mssql+pyodbc://username:password/dbname'
metadata.bind.echo = False
class Users(Entity):
using_options(tablename = 'users')
username = Field(String(50), unique=True)
fullname = Field(String(255))
email = Field(String(255))
passwordmd5 = Field(String(32))
def __repr__(self):
return "<Users ({})({})({})>".format(self.username, self.fullname, self.email)
def prettyname(self):
return {'username':'User Name', 'fullname':'Full Name', 'email':'Email Address', 'passwordmd5':'$hidden$'}在我的代码中,我需要一种方法来获得GUI的“漂亮”标签名称,而不必在GUI中硬编码(我一直在尝试创建一种动态的方法来构建GUI窗体)。因此,我在我的数据模型中添加了'prettyname‘方法,以便在该数据模型中提供一些特定于应用程序的元数据。我所要做的就是返回一个条目字典。
我还有一个次要问题,有时需要从Users的类实例中获取数据,有时需要从Users的查询结果中获取数据(例如,Users.get_by(id=1))。事实证明,检索这些数据必须通过两种方式来完成。在类实例中,我必须以这种方式获取值:
prettyname = Users().prettyname()['username']但是当我使用查询结果时,它是:
prettyname = queryresult.prettyname()['username']当我使用前一个方法(类实例方法)时,SQLAlchemy似乎有一个真正的问题-因为每次我看到崩溃时都会使用这个方法。当我使用后一种情况时,我从来没有看到崩溃。尽管如此,我仍然需要访问类实例中的元数据。
修复,或者我应该说,修复这个问题的结果来自于另一篇Stackoverflow文章(感谢Stackoverflow的每一个人--没有你我什么都不是)。我更改了dbmodel的结构:
class Users(Entity):
using_options(tablename = 'users')
username = Field(String(50), unique=True, info={'prettyname':'User Name'})
fullname = Field(String(255), info={'prettyname':'Full Name'})
email = Field(String(255), info={'prettyname':'Email Address'})
passwordmd5 = Field(String(32), info={'hidden':True})
def __repr__(self):
return "<Users ({})({})({})>".format(self.username, self.fullname, self.email)这允许我使用一种常见的自省方法来获取info参数中的字典数据,而不管我正在查看的是类实例还是查询结果。在本例中,我使用类或查询结果的“.table”方法,然后获取所需的列(.c),然后使用该列的.info方法返回字典。
无论是哪种情况,现在SQLAlchemy不再尝试在数据库中随意插入行。
https://stackoverflow.com/questions/5333170
复制相似问题