可变表名。

可变表名。

问:不需要使用字符串构造函数就可以使用变量作为表名吗?


信息:

我现在正在做一个项目,这个项目记录了我的模拟星图中的数据。为此,我将把所有数据加载到sqite数据库中。它运行得很好,但是我决定给我的数据库增加更多的灵活性、效率和可用性。我计划稍后在模拟中加入行星,并希望为每一颗恒星提供一张桌子。这样的话,我就不用去查询每一个太阳系中有2000万个行星的表了。

有人告诉我,使用字符串构造函数是不好的,因为它使我容易受到SQL注入攻击。虽然这不是什么大问题,因为我是唯一能够访问这些DBS的人,我想遵循最佳实践。也是这样,如果我做一个类似的项目,它是向公众开放的,我知道该做什么。

目前我正在做这件事:

cursor.execute("CREATE TABLE StarFrame"+self.name+" (etc etc)")

这是可行的,但我想做的更像:

cursor.execute("CREATE TABLE StarFrame(?) (etc etc)",self.name)

虽然我知道这可能是不可能的。虽然我会满足于

cursor.execute("CREATE TABLE (?) (etc etc)",self.name)

如果这是不可能的,我会接受这个答案,但如果有人知道如何做到这一点,请告诉。*)

我在用python编码。


慕后森
浏览 463回答 3
3回答

肥皂起泡泡

对于那些寻找将表作为变量的方法的人,我从对同一个问题的另一个回答中得到了这个结果。这里:它说了下面的话,它起作用了。所有这些都是引用自马霍克:不能使用参数替换表名。您需要自己将表名添加到查询字符串中。就像这样:query = 'SELECT * FROM {}'.format(table)c.execute(query)需要注意的一件事是表名的值的来源。如果这来自不受信任的源(例如用户),则需要验证表名以避免潜在的SQL注入攻击。一种方法可能是构造一个参数化查询,从DB目录中查找表名:import sqlite3def exists_table(db, name):     query = "SELECT 1 FROM sqlite_master WHERE type='table' and name = ?"     return db.execute(query, (name,)).fetchone() is not None
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python
MySQL