以下代码抛出“sqlalchemy.exc.CompileError错误:未使用的列名:\ id“。你知道吗
User = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('score', Integer)
)
values = [
{'score': 2, '_id': 1},
{'score': 3, '_id': 3}
]
query = User.update().where(User.c.id == bindparam('_id')).values(score=bindparam('score'))
await db.execute_many(query, values)
db
是databases.Database
的实例。注意,我必须使用名称'\u id',因为SQLalchemy说'id'是保留的。你知道吗
除了个别地更新每一行之外,还有别的解决办法吗?你知道吗
Database.execute_many()
调用Connection.execute_many()
,它将您的查询分解为单独的查询(在values
中每个元素一个),下面是方法(source):注意,它调用
_build_query()
方法(source):当您不传递} )。这使得它试图编译的查询:
str
查询并且传递值时,control进入elif values:
条件处理,其中值的单个dict被解压到查询的.values()
方法中(即^{第二个values子句产生一个新的更新,新的bind参数试图设置
score
和_id
的值。这会导致查询编译失败,因为表上没有_id
列。你知道吗所以要重现错误的MCVE实际上是这样的:
这引发了:
为了总结这个问题,您构建了一个查询,其中bind参数同时传递给
Update.where()
和Update.values()
。然后将该查询和值传递给Database.execute_many()
,在那里它们将值列表中的各个元素解压到查询上的第二个Update.values()
调用中,该调用将您的查询替换为试图为不存在的_id
列设置值的查询。你知道吗当使用sqlalchemy引擎和查询时,查询工作正常:
否则,应该将查询作为字符串发送到
Database.execute_many()
,因为这意味着查询将在_build_query()
方法的if isinstance(query, str):
部分处理,这将避免对查询进行第二次.values()
调用:相关问题 更多 >
编程相关推荐