You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:20:58