【问题标题】:Automagically expanding a Python list with formatted output使用格式化输出自动扩展 Python 列表
【发布时间】:2010-09-23 20:38:55
【问题描述】:

有谁知道是否有办法在 Python 中自动扩展列表,用逗号分隔?我正在编写一些使用 MySQLdb 库的 Python 代码,并且正在尝试使用某些键值动态更新 MySQL 数据库中的行列表。

例如,在下面的代码中,我希望将 record_ids 列表中的数值扩展为 SQL“IN”子句。

import MySQLdb
record_ids = [ 23, 43, 71, 102, 121, 241 ]

mysql = MySQLdb.connect(user="username", passwd="secret", db="apps")
mysql_cursor = mysql.cursor()

sqlStmt="UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in ( %s )"

mysql_cursor.execute( sqlStmt, record_ids )
mysql.commit()

任何帮助将不胜感激!

【问题讨论】:

    标签: python list mysql


    【解决方案1】:

    尝试:

    ",".join( map(str, record_ids) )
    

    ",".join( list_of_strings ) 加入一个字符串列表,用逗号分隔它们

    如果您有数字列表,map( str, list ) 会将其转换为字符串列表

    【讨论】:

      【解决方案2】:

      我做这样的事情(以确保我使用绑定):

      sqlStmt=("UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in (%s)"
          % ', '.join(['?' for n in record_ids]))
      
      mysql_cursor.execute(sqlStmt, record_ids)
      mysql.commit()
      

      这适用于您想要绑定的所有动态列表,而不会让您容易受到 SQL 注入攻击。

      【讨论】:

      • 这是 python 的 DB API 的缺点。我已经为 sqlite 和 postgres 完成了上述操作,但由驱动程序决定绑定的工作方式。不过,同样的原则也适用。生成绑定并输入数据。
      【解决方案3】:

      除了给出的答案之外,请注意,您可能希望将空列表大小写为特殊情况,因为“where rec_id in ()”不是有效的 SQL,因此您会收到错误消息。

      还要非常小心地像这样手动构建 SQL,而不是仅仅使用自动转义的参数。对于整数列表,它会起作用,但如果您正在处理从用户输入接收的字符串,这样做会打开一个巨大的 SQL 注入漏洞。

      【讨论】:

      • +1 请使用绑定变量。 stackoverflow.com/questions/1973/…
      • 这只会从数据库中读取数据并更新数据。它永远不会使用从 Internet 输入的数据。
      • 小心:数据库中的大量数据最终是由用户输入的。即使您的案例是完全安全的,但后来出现类似问题的一些程序员可能会决定复制现有代码。即使在安全的情况下,关心这些事情也是一个好主意。加强和表现出好习惯总比坏习惯好。
      【解决方案4】:

      与达斯汀的回答略有不同:

      sqlStmt=("UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in (%s)"
          % ', '.join(['?'] * len(record_ids)))
      

      【讨论】:

      • 它不能正确展开,但它可以:', '.join('?' * len(record_ids)) -- 我有点喜欢这样,虽然感觉有点不对。跨度>
      【解决方案5】:

      或者,使用替换

      sqlStmt="UPDATE apps.sometable SET lastmod=SYSDATE() where rec_id in " +
          record_ids.__str__().replace('[','(').replace(']',')')
      

      【讨论】:

        猜你喜欢
        • 2016-12-26
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多