PySide (PyQt)에서 SQLAlchemy를 사용하는 데 문제가 있습니다. 나는 팝업하는 QtGui.QDialog
노력하고있어,하지만 난 할 때이 SQLAlchemy의 예외를 throw :SQLAlchemy IntegrityError
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
(어떤 코드를 일부 테이블 열을 쿼리 할 수 있음)이 오류가 throw됩니다 것 같습니다. 이상하게도 이것은 일관성이 없습니다. 예외가 발생하기 전에 팝업이 먼저 나타나기도하고 예외 뒤에 팝업이 나타나는 경우가 있습니다. 정상적인 상황 QTableView
데이터 모델은 작동 좋은, 그냥 나는이 대화 상자를 팝업 (그리고 아이러니하게도, 팝업은 전혀 등 QLineEdit,은 QTextEdit, 같은 단지 표준 위젯 어떤 QTableView
를 사용하지 않는)
그것은 만약을 때 도와 드리겠습니다. 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)를 사용하고 있습니다. 그리고 예, PC를 재부팅하려고 시도했지만 재부팅 후에도 문제가 계속 발생합니다. 저는이 특정 프로젝트에서 많은 것을 가지고 있기 때문에 더 많은 코드를 게시하는 것을 꺼려합니다. 그리고 문제를 해결할 수는 없습니다.
SQLAlchemy 및/또는 PyQt에서 이와 관련 될 수있는 이상한 점을 알고 싶습니다. 또한 대형 데이터 모델을 구축 할 때 SQLAlchemy를 계속 사용할 수 있기를 기대합니다. 나는이 시점에서 이것을 버리고 PyQt의 SQL 기능을 사용하기를 꺼린다.
select 문은 아무 작업도 수행하지 않았지만 쿼리 전에 세션에 문제가 발생했을 수 있습니다. 쿼리가 실행되면 변경 사항이 플러시됩니다 (예 : 사용자 삽입). "dbviewandmodel.py"파일의 나머지 부분을 볼 수 있습니까? –
나는이 상황이 발생했을 때 (어떤 데이터도 삽입하지 않고 데이터베이스의 데이터를 수정하지 않고) 데이터를 쿼리하는 경우에도 모든 종류의 데이터베이스 수정 작업을 수행하지 않았습니다. 나는이 충돌이 일어나지 않는 방법을 발견했다고 생각한다. (실제로는 수정이 아니라, 더 구체적으로 뭔가 특별한 일을하지 않음으로써 일어날 수있다.) 조금 길어질수록 답변을 추가 할 것입니다. – Raceyman