2012-02-24 90 views
1

我想转换一个XML到SQLite和得到一个奇怪的错误:PyQt的,SQLAlchemy的 - 怪异插入崩溃

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',) 

其中线130对应

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

这里是整个代码

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() 

其崩溃在温度= '50' 的第三值。

我完全不解,并不能找到什么地方错了。

+0

所以你是说temp.text的内容(这是字符串'?“(” 50' )'根据错误消息)是不是真的在XML属性定义的内容?在这种情况下,这是XML解析器的问题,而不是sqlalchemy或sqlite,不是? – jogojapan 2012-02-24 04:53:52

+0

xml解析器没有问题,正如我所说的,所有temp.text值都在消息框中正确显示(如果我删除了最后一行)。此外,我在程序中使用xml文件和相同的解析方法 - 没问题。我只想从xml更改为sqlite。 – linuxoid 2012-02-24 05:15:32

+0

您的错误在't_id = select([tb_temperatures.c.id],tb_temperatures.c.temperature == temp.text)'中说过问题''但您要删除最后一个插入语句及其作品?请提供您在控制台上的全部回溯。 – Nilesh 2012-02-24 05:17:58

回答

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() 

我在Python 2.7,0.7 SQLAlchemy的,Fedora的测试此。这对我有用。请尝试在你的地方,如果它的工作,然后请提供正在创建问题的XML数据。

希望这将帮助你了解你的问题。

+0

这与XML没有任何关系,我用temps = ['25','38','50','100']替换了xml,它仍然在'50'处崩溃。 WTH!这是疯了。或者我是? – linuxoid 2012-02-25 06:44:38

+0

是的,你的代码有效。所以,在其他模块中做所有的事情。这个特别的东西很奇怪。 – linuxoid 2012-02-25 07:19:37