gpt4 book ai didi

python - pysqlite:列名或表名的占位符替换?

转载 作者:IT王子 更新时间:2023-10-29 06:18:27 24 4
gpt4 key购买 nike

我正在使用 pysqlite 制作一个程序来处理一些数据。对多个表和列中的相似字段进行相同的操作,所以我想我可以将sql语句参数化如下:

def foo():
column = 'c'
table = 't'
row = 1
# preferred approach, gives syntax error
c.execute('SELECT ? FROM ? WHERE id=?', (column, table, row))
# sanity check, works fine
c.execute('SELECT c FROM t WHERE id=?', (row))
# workaround, also works, but is this the right way?
c.execute('SELECT % FROM % WHERE id=?' % (column, table), row))

我得到的错误不是很有用(sqlite3.OperationalError: near "?": syntax error),但我明白了:Pysqlite 不喜欢以这种方式使用占位符。

任何人都可以指出这里发生了什么以及执行上述操作的正确方法吗?

最佳答案

您根本不能对列名或表名使用占位符。我对此没有权威的引用——我只是通过尝试和失败才“知道”这一点。不过,这是有道理的:

  • 如果可以对列和表进行参数化,则几乎没有目的是在获取之前准备(execute-ing)SQL 语句,因为语句的所有部分都可以替换。
  • 我不确定 pysqlite1,但 MySQLdb 会自动引用所有字符串参数。不应引用列名和表名。所以如果必须的话,会使驱动程序所需的解析复杂化决定占位符是代表列名还是表名需要引用的值。

简而言之,您找到了正确的方法——使用字符串格式化。

c.execute('SELECT {} FROM {} WHERE id=?'.format(column, table), row))

1 并非所有驱动程序都引用参数 -- oursql 不引用,因为它分别向服务器发送 SQL 和参数。

关于python - pysqlite:列名或表名的占位符替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8841488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com