我正在尝试将xml转换为sqlite并得到一个奇怪的错误:
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()
在temp = '50'的第3个值崩溃。
我完全不解,也找不到它的错误。
答案 0 :(得分: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,SQLAlchemy 0.7,Fedora中进行了测试。这对我有用。如果它正常工作,请尝试在您的位置,然后请提供创建问题的xml数据。
希望这能帮助您理解您的问题。