2012-02-24 2 views
1
I SQLite는과 이상한 오류가 발생하는 XML로 변환하기 위해 노력하고있어

: 라인 130PyQt는 SQLAlchemy도 - 이상한 삽입 충돌

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'의 세 번째 값에서 충돌합니다.

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

+0

그래서 오류 메시지에 따라 '?'('50', ') 문자열 인 temp.text의 내용은 실제로 XML 속성에 정의 된 내용이 아닙니까? 이 경우 XML 파서에 문제가 있으며 sqlalchemy 나 sqlite에서는 문제가되지 않습니다. – jogojapan

+0

내가 말했듯이 모든 temp.text 값이 메시지 상자에 올바르게 표시되기 때문에 XML 파서에는 아무런 문제가 없습니다 (마지막 줄을 삭제하면). 게다가, xml 파일과 같은 파싱 메서드를 프로그램에서 사용합니다. 문제 없습니다. 난 그냥 xml에서 sqlite로 변경하고 싶다. – linuxoid

+0

당신의 에러는't_id = select ([tb_temperatures.c.id], tb_temperatures.c.temperature == temp.text)'에 문제가 있지만 마지막 insert 문과 그 작업을 제거하고 있습니까? 콘솔에있는 전체 추적을 제공하십시오. – Nilesh

답변

1

나는 내 방식대로 코드를 시도했다. QT4와을 테스트하기위한 sqlitefktg4sa가 없으므로 코드가 SQLAlchemy 구문으로 만 변환됩니다. 또한 더미 값을 삽입 할 수 있도록 XML을 구문 분석하지 않아도됩니다.

코드는

import sys 
from sqlalchemy import create_engine 
from sqlalchemy import Table, Column, Integer, String, Float, MetaData, ForeignKey 
from sqlalchemy.sql import select, and_ 

db_file = "/my/home/db.sqlite" 
db = create_engine('sqlite:///' + db_file, echo=True) 
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) 
      ) 


metadata.create_all(db) 


matlist = ['mat1', 'mat2', 'mat3'] 
templist = ['temp1', 'temp2', 'temp3'] 

data = tb_materials.insert().values(material = "CS") 
connection.execute(data) 

for m in matlist: 
    data = tb_materials.insert().values(material = m) 
    connection.execute(data) 

for t in templist: 
    data = tb_temperatures.insert().values(temperature = t) 
    connection.execute(data) 


m_id = select([tb_materials.c.id], tb_materials.c.material == 'mat3') 
row = connection.execute(m_id) 
data = row.fetchone() 
m_id_key = data[0] 

t_id = select([tb_temperatures.c.id], tb_temperatures.c.temperature == 'temp1') 
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, density = 'density', elasticity = 'electricity', stress = 'stress') 
connection.execute(z) 

connection.close() 

내가 파이썬 2.7, SQLAlchemy의 0.7, 페도라이 테스트입니다. 이것은 나를 위해 일하고있다. 문제가있는 xml 데이터를 제공해 주시면 작업을 시도하십시오.

희망 사항은 문제를 이해하는 데 도움이됩니다.

+0

XML과 관련이 없으므로 xml을 temps = [ '25', '38', '50', '100']로 바꿨고 여전히 '50'에서 정확히 충돌합니다. WTH! 그것은 미친 짓이야. 아니면 내가? – linuxoid

+0

예, 코드가 작동합니다. 그래서 다른 모든 모듈에서 모든 것을 수행하십시오. 이 특별한 것을 가지고 이상한 것이 있습니다. – linuxoid