为了账号安全,请及时绑定邮箱和手机立即绑定

可变表名。

可变表名。

慕后森 2019-07-05 15:27:33
可变表名。问:不需要使用字符串构造函数就可以使用变量作为表名吗?信息:我现在正在做一个项目,这个项目记录了我的模拟星图中的数据。为此,我将把所有数据加载到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编码。
查看完整描述

3 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

对于那些寻找将表作为变量的方法的人,我从对同一个问题的另一个回答中得到了这个结果。这里:

它说了下面的话,它起作用了。所有这些都是引用自马霍克:

不能使用参数替换表名。您需要自己将表名添加到查询字符串中。就像这样:

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


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 460 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信