在形成SQL查询时,字符串替换不受欢迎,您如何动态分配表名?
sqlite3相当新,所以请在这里忍受。
我想要一个函数,可以将表名和值传递给该函数。
我最初是这样的:
def add_to_table(table_name, string):
cursor.execute('INSERT INTO {table} VALUES ({var})'
.format(
table=table_name,
var=string)
)
可以,但是对sqlite3的进一步阅读表明这是处理事情的非常不安全的方法。但是,使用它们的?
语法,我无法传递名称来指定变量。
我尝试在?
表中添加一个,但这会引发语法错误。
cursor.execute('INSERT INTO ? VALUES (?)', ('mytable','"Jello, world!"'))
>> >sqlite3.OperationalError: near "?": syntax error
能否table
在sql语句中安全且动态地传递?
-
这不是动态字符串替换 本身
就是问题所在。用用户提供的字符串动态替换字符串是个大问题,因为这使您容易受到SQL注入攻击。如果绝对100%确保表名是您控制的安全字符串,则将其拼接到SQL查询中将是安全的。if some_condition(): table_name = 'TABLE_A' else: table_name = 'TABLE_B' cursor.execute('INSERT INTO '+ table_name + 'VALUES (?)', values)
就是说,使用这样的动态SQL肯定是一种代码味道,因此您应该仔细检查以查看是否可以找到没有动态生成的SQL字符串的更简单的替代方法。另外,如果您真的想要动态SQL,则可以使用类似SQLAlchemy的方法来确保生成的SQL格式正确。