У меня проблема с использованием SQLAlchemy с PySide (PyQt). Я пытаюсь открыть 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). У меня Windows 7 с SQL 2008 R2 (Express). И да, я пытался перезагрузить компьютер, но проблема все еще возникает после перезагрузки. Я не хочу публиковать больше кода, потому что у меня его много в этом конкретном проекте, и я не могу определить проблему как-то конкретно.
Я надеюсь, что кто-то может знать о странностях в SQLAlchemy и/или PyQt, которые могут быть связаны с этим. Я также надеюсь, что смогу продолжать использовать SQLAlchemy, поскольку у меня построена большая модель данных; На данный момент я не хочу отказываться от этого и использовать функции PyQt SQL.