使用SQLAlchemy+SQLite驱动添加数据时出现类型匹配错误求助
SQLAlchemy插入数据报错:'<' not supported between instances of 'int' and 'str'
我参考一本讲解SQLAlchemy基础(贴近DB-API)的书籍示例编写代码,但因版本更新需修改语法。在使用位置占位符预写SQL语句插入表行时遇到问题,代码如下:
import sqlalchemy as sa from sqlalchemy import text engine = sa.create_engine('sqlite://') with engine.connect() as conn: print (conn) conn.execute(text('''CREATE TABLE zoo ( critter VARCHAR(20) PRIMARY KEY, count INT, damage FLOAT)''')) ins = text('INSERT INTO zoo (critter, count, damage) VALUES (?,?,?)') conn.execute (ins, [('bear', 2, 1000.0)]) conn.execute (ins, [('weasel', 1, 2000.0)]) rows = conn.execute('SELECT * FROM zoo') for row in rows: print (row)
运行后抛出错误:
'<' not supported between instances of 'int' and 'str'
我并未进行比较操作,且值的顺序与列对应正确,恳请帮忙分析问题原因。
问题原因与解决方案
核心原因
该错误源于SQLAlchemy 2.0+版本对execute()方法的参数传递逻辑做了变更:
旧版本中,列表包裹的元组会被识别为批量插入参数,但新版本中,若给execute()传递的第二个参数是列表,它会直接将列表当作单条语句的参数组,导致参数与占位符匹配混乱,进而触发内部类型比较错误。
修复方法
有两种直接可行的修复方式:
方式1:单条插入直接传元组
去掉参数外层的列表,直接传递元组作为单条插入的参数:
conn.execute(ins, ('bear', 2, 1000.0)) conn.execute(ins, ('weasel', 1, 2000.0))
方式2:批量插入用executemany()
如果需要插入多条数据,推荐使用executemany()方法,直接传入参数列表,效率更高:
conn.executemany(ins, [('bear', 2, 1000.0), ('weasel', 1, 2000.0)])
另外补充:新版本中执行查询语句时,建议用text()包裹SQL,避免潜在兼容性问题:
rows = conn.execute(text('SELECT * FROM zoo'))
内容的提问来源于stack exchange,提问作者autumnweaver218
相关产品推荐
相关产品推荐

