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)
我想使用 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)