2012-03-09 2 views
0

내가 sqlite가에 XML을 변환하고 이상한 오류를 얻으려고는 : 라인 130PyQt는 SQLAlchemy도, SQLite는 - 이상한 삽입 충돌

여기
t_id = select([tb_temperatures.c.id], tb_temperatures.c.temperature == temp) 

에 해당

Traceback (most recent call last): 
File "C:\Temp\xxx\scripts\xml_to_db.py", line 212, in <module> 
win = Test(a) 
File "C:\Temp\xxx\scripts\xml_to_db.py", line 20, in __init__ 
self.testdb() 
File "C:\Temp\xxx\scripts\xml_to_db.py", line 133, in testdb 
row = connection.execute(t_id) 
File "C:\Temp\PortablePython\App\lib\site-packages\sqlalchemy\engine\base.py", line 1405, in execute 
params) 
File "C:\Temp\PortablePython\App\lib\site-packages\sqlalchemy\engine\base.py", line 1538, in _execute_clause 
element 
compiled_sql, distilled_params 
File "C:\Temp\PortablePython\App\lib\site-packages\sqlalchemy\engine\base.py", line 1646, in _execute_context 
context) 
File "C:\Temp\PortablePython\App\lib\site-packages\sqlalchemy\engine\base.py", line 1639, in _execute_context 
context) 
File "C:\Temp\PortablePython\App\lib\site-packages\sqlalchemy\engine\default.py", line 330, in do_execute 
cursor.execute(statement, parameters) 
InterfaceError: (InterfaceError) Error binding parameter 0 - probably unsupported type. u'SELECT temperatures.id \nFROM temperatures \nWHERE temperatures.temperature = ?' ('50',) 

는 전체의 코드

def testdb(self): 
    db_file = "C:/Temp/xxx/data/xxx/db.sqlite" 

    file=QFile(db_file) 
    if file.exists(): 
     file.remove() 

    db = create_engine('sqlite:///' + db_file) 
    connection = db.connect() 

    metadata = MetaData() 

    tb_materials = Table('materials', metadata, 
     Column('id', Integer, primary_key=True), 
     Column('material', String) 
     ) 

    tb_temperatures = Table('temperatures', metadata, 
     Column('id', Integer, primary_key=True), 
     Column('temperature', String) 
     ) 

    tb_mat_data = Table('mat_data', metadata, 
     Column('id', Integer, primary_key=True), 
     Column('mat_id', None, ForeignKey('materials.id', onupdate="CASCADE", ondelete="CASCADE")), 
     Column('temp_id', None, ForeignKey('temperatures.id', onupdate="CASCADE", ondelete="CASCADE")), 
     Column('density', String), 
     Column('elasticity', String), 
     Column('stress', String) 
     ) 

    auto_assign(metadata, db) 
    metadata.create_all(db) 

    for m in ['SS 316']: 
     data = tb_materials.insert().values(material = m) 
     connection.execute(data) 

    for t in ['25', '38', '50', '150']: 
     data = tb_temperatures.insert().values(temperature = t) 
     connection.execute(data) 

    materials = ['SS 316'] 
    for material in materials: 
     m_id = select([tb_materials.c.id], tb_materials.c.material == material) 
     row = connection.execute(m_id) 
     data = row.fetchone() 
     m_id_key = data[0] 
     temps = ['25', '38', '50', '150'] 
     for temp in temps: 
      QMessageBox.about(self,"",temp) 
      t_id = select([tb_temperatures.c.id], tb_temperatures.c.temperature == temp) 
      row = connection.execute(t_id) 
      data = row.fetchone() 
      t_id_key = data[0] 
      z = tb_mat_data.insert().values(mat_id = m_id_key, temp_id = t_id_key) 
      connection.execute(z) 

    connection.close() 
    quit() 

temp = '50'의 세 번째 값에서 충돌합니다.

나는 완전히 혼란스럽고 잘못된 점을 발견하지 못했습니다.

답변

1

정확히 무슨 일이 일어나고 있는지 전혀 알지 못하지만 정확히 Connection과 관련이 있습니다. 나는 버그이 있다고 가정하고 다음 실행 전에 명령문 준비에서 매개 변수가 제대로 정리되지 않은 것과 관련이 있습니다. 예를 들어

, 당신은 db.execute(z)connection.execute(z) 교체 할 경우 (연결형 실행을 근본적으로 다른 연결을 사용하여),이 아마 문이 그 (row = connection.execute(m_id)) 사이에-실행으로, 잘 작동 단 1 매개 변수가됩니다.

또한 연결없는 실행 (직접 engine/db.execute(...) 호출)을 사용하면 모든 쿼리에 새로운 연결이 사용되므로 모든 작업이 정상적으로 작동합니다.

단일 SQL 문 :이 외에도이 문제/버그에서? 당신이 실제로 쿼리의 Correlated Update 유형 사용하여 하나 SQL INSERT 문에서 mat_data에 삽입을 실행할 수 있습니다

QMessageBox.about(self,"",temp) 
s = select([tb_temperatures.c.id], tb_temperatures.c.temperature == temp).limit(1) 
z = tb_mat_data.insert().values(mat_id = m_id_key, temp_id = s) 
connection.execute(z) 
+0

밴을, 그 일을! 당신이 말했듯이, 'connection.execute (z)'대신에 'db.execute (z)'를하거나 select에 limit (1)을 추가하면 작동합니다. 고맙습니다. 추신. 그러나 나는 다른 5-6 xml 파일을 모두 문제없이 별도의 데이터베이스로 변환하는 또 다른 5-6 개의 스크립트를 가지고있는 동안 왜이 특별한 경우에는 작동하지 않는지 이해할 수 없습니다. ??? – linuxoid

+0

@ user665327 : 언급 한 바와 같이, 나는 pyodbc 나 odbc에서 매개 변수를 정리하는 버그가 있다고 생각합니다. 아마도 가장 효과가있는 다른 코드의 코드는 동일한 수 (및/또는 유형)의 매개 변수를 가지거나 명시 적 커밋 또는 이와 유사한 코드를가집니다. – van