【问题标题】:Insert a python dict into an SQLite DB将 python dict 插入 SQLite DB
【发布时间】:2012-02-07 12:18:03
【问题描述】:

我有一本字典,我想将所有值添加到 sqlite 数据库。字典中的所有键都存在于数据库中,并且所有键都是字符串类型。然而,我在将值输入数据库时​​遇到了麻烦。下面的代码很丑陋,不安全,并且每当遇到带有 " 的字符串时都会出错,但它有点工作。

Query="INSERT INTO packages VALUES("
    for tag in Tags:
       Query=Query + '"' + Package[tag] + '", '
    Query=Query[:-2]+")"
cursor.execute(Query)

我怎样才能优雅地解决这个问题,使其安全并接受字符串中带有 " 的输入?我遇到了一些其他方法。例如:

fields = Package.keys()
values = Package.values()
query = "INSERT INTO packages (%s) VALUES (%%s);" % (",".join(fields))
cursor.execute(query, values)

但它会引发类型错误。

TypeError: function takes at most 2 arguments (38 given)

到目前为止我遇到的最优雅的解决方案似乎是

sql_insert = ('INSERT INTO packages (%s) VALUES (%s)' % 
             (','.join('%s' % name for name in Package),
             ','.join('%%(%s)s' % name for name in Package)))
cursor.execute(sql_insert, Package)

但它会抛出一个操作错误,说

sqlite3.OperationalError: near "%": syntax error

再一次,我的问题是如何优雅地安全地将字典中的值添加到数据库中?

附:值得注意的是,我使用的是 Python 2.5.1。

【问题讨论】:

    标签: python sql database sqlite dictionary


    【解决方案1】:

    Afaik,当查询有“?”占位符 execute() 方法会根据参数类型自动进行正确转义。因此,以下应该有效:

    query = 'INSERT INTO packages VALUES(%s)' % ','.join(['?'] * len(Tags))
    cursor.execute(query, Tags)
    

    【讨论】:

    • 像魅力一样工作。谢谢!
    • 除了,如果Tags 是 OP 使用的字典,Tags 将只传递键名,它们将按任意顺序排列。
    • 不幸的是,这实际上并没有起作用,因为它使用字段名称作为数据值创建了数据库条目。我认为它正在工作,因为这个脚本运行时没有抛出错误,但是当我今天早上查看数据库时(让它在一夜之间运行)它没有适当的值。
    • 最后我最终将字典值转换为列表,然后使用类似于此答案的代码插入它们。
    【解决方案2】:

    我遇到了同样的问题,但是我遇到的问题是并非所有字典条目都包含表的所有列,因此我创建了以下解决方案

    keys, values = zip(*Package.items())
    insert_str =   "INSERT INTO packages (%s) values (%s)" % (",".join(keys),",".join(['?']*len(keys)))
    cursor.execute(insert_str,values)
    

    【讨论】:

      猜你喜欢
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      相关资源
      最近更新 更多