当前位置: 首页 > 面试题库 >

pysqlite:用占位符替换列或表名?

邬宜然
2023-03-14
问题内容

使用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语句的目的不多,因为可以替换语句的所有部分。
  • 我不确定pysqlite 1,但MySQLdb自动引用所有字符串参数。列名和表名不应加引号。因此,如果必须决定占位符是否表示列名或表名与需要引用的值,则会使驱动程序所需的解析复杂化。

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

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

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



 类似资料:
  • 问题内容: 对于我的项目,我需要将有向图转换为图的张量流实现,就好像它是神经网络一样。在tensorflow版本1中,我可以将所有输入定义为占位符,然后使用广度优先搜索图为输出生成数据流图。然后,我只需使用feed_dict来输入我的输入。但是,在TensorFlow v2.0中,他们决定完全放弃占位符。 如何在不使用占位符的情况下为每个接受可变数量的输入并返回可变数量的输出的图制作tf.func

  • 我的问题的背景是,我试图本地化一些HTML文件,但我不想为每种语言拥有完整的HTML副本,我只想“以Android的方式”做到这一点,并在我的HTML中使用本地化字符串资源。 假设我在一个字符串中有一些HTML,在将HTML发送到WebView之前,应该用字符串资源替换占位符--我如何做到这一点? 和这些字符串资源: 现在,举一个简单的例子,我可以使用string.replace(),但是如果我想

  • 我一直在尝试通过FieldMailMerge和VariableReplace示例,但似乎无法运行本地测试用例。我基本上试图从一个docx模板文档开始,并让它从一个模板创建x个docx文档,替换变量。 在下面的代码中,试图替换单个变量,但失败了。模板文件中的${}值作为处理的一部分被移除,因此我认为它正在查找它们,而不是出于某种原因替换它们。我明白这可能是由于格式问题,正如示例代码的注释中所解释的那

  • 问题内容: 我的字符串看起来像这样:“您可以在[开始日期+ 30]之前使用促销。” 我需要将占位符替换为实际日期- 这是销售的开始日期加上30天(或其他任何数字)。也可以单独显示而无需添加数字。同样,占位符内的所有多余空格都应被忽略,并且不要使替换失败。 用Java做到这一点的最佳方法是什么?我正在考虑用于查找占位符的正则表达式,但不确定如何执行解析部分。如果只是[开始日期],我将使用该方法,但由

  • 我正在使用剑道下拉列表,我需要一个占位符的下拉列表,当我选择下拉列表时,它不应该出现在列表中。我尝试使用optionLabel,但此值显示在列表中。 我需要一个解决方案,我可以添加一个占位符,该值不应显示为下拉列表中的选项。

  • 您不需要理解内容,只需查看我的占位符和。有10页与这些占位符,现在我应该取代他们与其他内容。黑色和黄色的盒子是公司的照片,我不会分享。 现在,我开始阅读整个docx4j文档,并在一段时间后生成以下代码: 一些解释: 是上图中文件的路径 是应该替换的值 是应该替换的值 但是当我运行这个方法时,什么也没有发生,我的控制台只是打印一些信息。如果它们很重要,我会编辑帖子,但我不这么认为。 那么我的错在哪里