0

sqlite3 很新,所以请耐心等待。

我想要一个函数,我可以将表名和要更新的值传递给它。

我最初是这样开始的:

def add_to_table(table_name, string):
    cursor.execute('INSERT INTO {table} VALUES ({var})'
        .format(
            table=table_name,
            var=string)
        )

哪个工作正常,但是关于 sqlite3 的进一步阅读表明这是一种非常不安全的处理方式。但是,使用它们的?语法,我无法传递名称来指定变量。

我尝试在?表格中添加 a ,但这会引发语法错误。

cursor.execute('INSERT INTO ? VALUES (?)', ('mytable','"Jello, world!"'))
>> >sqlite3.OperationalError: near "?": syntax error  

tablesql语句中的in可以安全动态的传入吗?

4

2 回答 2

3

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

于 2013-10-05T04:21:55.817 回答
1

使用字符串操作组合 SQL 语句很奇怪,不仅因为安全隐患,还因为字符串是“哑”对象。使用 sqlalchemy 核心(你甚至不需要 ORM 部分)几乎就像使用字符串一样,但每个片段都会更智能,并且更容易组合。查看sqlalchemy wiki以了解我在说什么。

例如,使用 sqlsoup,您的代码将如下所示:

db = SQLSoup('sqlite://yourdatabase')
table = getattr(db, tablename)
table.insert(fieldname='value', otherfield=123)
db.commit()

另一个优点:代码独立于数据库 - 想迁移到 oracle?更改连接字符串,您就完成了。

于 2013-10-05T04:32:51.720 回答