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
Can the table
在sql语句中安全且动态地传入?
它不是动态字符串替换per-se那就是问题所在。它使用用户提供的字符串进行动态字符串替换,这是一个大问题,因为这会让您遭受 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 格式良好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)