在形成SQL查询时,字符串替换不受欢迎,您如何动态分配表名?

发布于 2021-01-29 17:08:14

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语句中安全且动态地传递?

关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这不是动态字符串替换 本身
    就是问题所在。用用户提供的字符串动态替换字符串是个大问题,因为这使您容易受到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格式正确。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看