Python sqlalchemy "not all arguments converted during bytes formatting"

Python sqlalchemy "not all arguments converted during bytes formatting"

我想使用 sqlalchemy 模块将一些数据插入到我的数据库中。但是当我尝试它时,它在 MySQLdb\cursors.py 中的 query = query % args 字符串上给我错误 TypeError: not all arguments converted during bytes formatting。我尝试使用 pymysql 而不是 mysqldb,但它给出了同样的错误。

这是代码:

myquery = "INSERT INTO some(id, name, info, det_info, class, cluster, logo) VALUES (?, ?, ?, ?, ?, ?, ?)"

for row in result:
    connection1.execute(myquery, (None, row['name'], row['info'], row['det_info'], row['class'], row['cluster'], row['logo']))

我尝试了不同的发送参数变体:有方块和没有方块,结果都是一样的。 我试图将这些字符串添加到 cursors.py:

print(query)
print('----@@@@----@@@@----@@@@----@@@@----@@@@----@@@@----@@@@----')
print(args)

它给出了这个:

b'INSERT INTO some(id, name, info, det_info, class, cluster, logo) VALUES (?, ?, ?, ?, ?, ?, ?)'

还有这个:

(b'NULL', b"'\xd0\xb8\xd0\xbd\xd1\x81\xd1\x82\xd0\xb8\xd1\x82\xd1\x83\xd1\x82'", b"'\xd0\x98\xd0\xbd\'", b"'Institute'", b"'Inte'", b"'\xd0\xa1\xd0\xbe'", b"'1.png'")

所以,我猜问题可能出在“(?, ?, ...)”以及它在 % 操作期间如何被参数改变。但是我不知道我说的对不对,也不知道怎么解决。

如问题评论中所述,Python DB-API 的不同实现可以选择使用不同的 paramstyle。例如,您选择的工具似乎实现了“格式”参数样式 (%s),但您试图使用“qmark”(?) 样式。

但是,由于您已为 SQLAlchemy 标记了此问题,请考虑使用 SQLAlchemy 的 .text 方法使用其自己的参数样式(“命名”)处理您的查询,并让 SQLAlchemy 负责将其转换为本机样式DB-API 层。这样,无论您访问哪个后端,您的参数查询看起来总是一样的(并且可以方便地启动命名参数)。

import sqlalchemy as sa

# ...

query = sa.text("INSERT INTO student (lastname, firstname) VALUES (:ln, :fn)")
values = {'ln': 'Thompson', 'fn': 'Gord'}
with engine.begin() as conn:
    conn.execute(query, values)