无法使sqlite/python中的参数正常工作?

无法使sqlite/python中的参数正常工作?,python,sqlite,Python,Sqlite,我对sqlite3中的参数有问题。问题来了又去,所以一定有什么我错过了。我试图将代码简化为最基本的形式,但仍然不明白我做错了什么。我可以使用sql='SELECT{}FROM{}.formatcol,tbl形式的字符串替换让这段代码正常工作,但我知道这是不安全的 下面是一个示例代码: def check_exists(self, col, tbl): self.cursor.execute("SELECT ? from ?" , (col, tbl)) if se

我对sqlite3中的参数有问题。问题来了又去,所以一定有什么我错过了。我试图将代码简化为最基本的形式,但仍然不明白我做错了什么。我可以使用sql='SELECT{}FROM{}.formatcol,tbl形式的字符串替换让这段代码正常工作,但我知道这是不安全的

下面是一个示例代码:

def check_exists(self, col, tbl):
        self.cursor.execute("SELECT ? from ?" , (col, tbl))
        if self.cursor.fetchall():
            return True
        return False
我是这样跑的:

check_exists('type', 'tbl_types')
这引发了这样一个例外:

self.cursor.execute("SELECT ? from ?" , (col, tbl))
OperationalError: near "?": syntax error
我的代码可以很好地使用显式参数:

def check_exists(self):
        self.cursor.execute('SELECT * from tbl_types')
        if self.cursor.fetchall():
            return True
        return False

>>> t.check_exists()
True

不能参数化列名或表名。出于对SQL注入攻击可能性的警惕,您可以对表名使用字符串插值。参数用于where子句中,而不是用于确定要从中选择的列或表。那么,对表名和列名使用字符串插值是否存在重大安全风险?这类场景的标准做法是什么?如果您可以接收到不可信的代码输入,那么肯定存在严重的安全风险,最好使用SQLAlchemy之类的库。