【问题标题】:Python, SQL: Set the columns read as parameterPython,SQL:将读取的列设置为参数
【发布时间】:2010-12-09 10:25:11
【问题描述】:

我有一个 SQL 查询,在 Python 中使用 Psycopg2 很疯狂。查询从arches 表中读取一些列:

rows = archesDB.read_all("""SELECT "+str(columns)[1:-1].replace("'","")+" 
                           FROM arches 
                           WHERE lower(arch) like '%%%s%%'""" % (arch.lower()))

我想对这个查询进行参数化,这样它就不会使用字符串连接指定所需的列,而是作为参数 - 一种更优雅的方式。

天真的方法是SELECT *,然后过滤掉我需要的列。但这会给数据库和网络带来不必要的数据负担,所以我宁愿避免它。

有什么想法吗?

亚当

【问题讨论】:

    标签: python sql parameters psycopg2


    【解决方案1】:

    列名不能在 SQL 字符串中作为 DB API 中的参数传递。而且它也没有任何意义。

    如果您需要检查列名输入,请事先对其进行清理。

    like 字符串应该作为参数进入

    如果 columns 变量包含列名的字符串列表,则以下代码示例将是一个改进:

    rows = archesDB.read_all("""SELECT %s 
                           FROM arches 
                           WHERE lower(arch) like %%s""" % (",".join(columns),),
                           ("%%%s%%" % (arch.lower(),),))
    

    首先,在第一个替换 (%s) 中插入列名,最后一个 %%s 转换为 %s。 然后 ("%%%s%%" % (arch.lower(),),) 用 %string_content% 创建一个字符串。 最后,db api 转义 %string_content% 并为其添加引号,最终进行查询。

    【讨论】:

      【解决方案2】:

      您不能参数化元数据。创建某个标识符到所需字段列表的映射,并使用它。

      【讨论】:

      • 即使用SELECT *,过滤想要的列?
      • 一个映射。就像一个字典。然后获取字段列表以放入查询中。
      猜你喜欢
      • 2022-11-03
      • 2016-07-19
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多