gpt4 book ai didi

python - 你如何干净地将列名传递给游标,Python/SQLite?

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:25 30 4
gpt4 key购买 nike

我是游标的新手,我正在尝试通过使用 sqlite3 的清理方法构建动态 python sql 插入语句来练习:

import sqlite3
conn = sqlite3.connect("db.sqlite")
cursor = conn.cursor()
list = ['column1', 'column2', 'column3', 'value1', 'value2', 'value3']
cursor.execute("""insert into table_name (?,?,?)
values (?,?,?)""", list)

当我尝试使用它时,我在值所在的行上收到语法错误“sqlite3.OperationalError: near “?””。尽管事实上当我对列进行硬编码(并从列表中删除列名)时,我没有问题。我可以用 %s 构建,但我知道首选经过 sanitizer 的方法。

我如何干净地插入这些?还是我遗漏了一些明显的东西?

最佳答案

(?, ?, ?) 语法仅适用于包含值的元组,恕我直言......这就是 sqlite3.OperationalError 的原因

我相信(!)你应该像这样构建它:

cursor.execute("INSERT INTO {tn} ({f1}, {f2}) VALUES (?, ?)".format(tn='testable', f1='foo', f1='bar'), ('test', 'test2',))

但是,如果允许用户自己提供表名或字段名,这并不能解决注入(inject)问题。

我不知道有什么内置方法可以帮助解决这个问题。但是你可以使用这样的函数:

def clean(some_string):
return ''.join(char for char in some_string if char.isalnum())

清理用户给定的表名或字段名。这应该足够了,因为表名/字段名通常只包含字母数字字符。

如果

some_string == clean(some_string)

如果为 False,为了安全起见,放弃一个很好的异常。

在我使用 sql 和 python 的过程中,我觉得你不需要让用户自己命名他的表和字段名。所以这对我来说是/很少有必要。

如果有人能详细说明并提供他的见解,我将不胜感激。

关于python - 你如何干净地将列名传递给游标,Python/SQLite?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37404048/

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