SQLite:用Python替换参数和字段名

SQLite:用Python替换参数和字段名,python,sql,sqlite,Python,Sql,Sqlite,一般来说,我对SQL和sqlite3比较陌生,对于在执行中使用问号或命名样式有疑问 我有几个数据库,其中有一个名为structures的表,我在Python的一个类中创建了一个方法,使用 def get\n(self,col\u name,n): cursor=self.con.cursor() 如果n==-1: execute(f“按id顺序从结构中选择{col_name}描述限制1”) 其他: execute(f“从id={n}的结构中选择{col_name}”) 尝试: val=curso

一般来说,我对SQL和sqlite3比较陌生,对于在执行中使用问号或命名样式有疑问

我有几个数据库,其中有一个名为
structures
的表,我在Python的一个类中创建了一个方法,使用

def get\n(self,col\u name,n):
cursor=self.con.cursor()
如果n==-1:
execute(f“按id顺序从结构中选择{col_name}描述限制1”)
其他:
execute(f“从id={n}的结构中选择{col_name}”)
尝试:
val=cursor.fetchall()[0][0]
除索引器e外:
打印(“错误的数据库-未找到“结构”表”)
提高e
返回值
在谷歌搜索过其他与sqlite3相关的问题后,我发现使用
f-strings
str.format
执行时容易受到注入攻击,因此我尝试根据以下内容更改执行:

如果n==-1:
cursor.execute(“按id描述限制1从结构订单中选择”(列名称)
其他:
execute(“SELECT?FROM structures,其中id=?”,(col_name,n))
打印(cursor.fetchall()[0][0])
这将输出列名本身而不是实际值,因为.execute使用
'id'
,而不是
id
如果
col\u name='id'

问题:
有没有一种方法可以这样使用问号或命名样式?

否。您只能在参数化查询中传递数据,但既不能传递SQL单词,如
插入
选择
更新
,也不能传递表名或字段名。

否。您只能在参数化查询中传递数据,但是既不是像
INSERT
SELECT
UPDATE
这样的SQL单词,也不是像表名或字段名这样的名称。

与@SergeBallesta的答案一致,您可以执行以下操作:

sql = 'SELECT {col_name} FROM structures WHERE id = ?'.format(col_name=colname)
cursor.execute(sql, [n])

它使用了两种约定的混合

与@SergeBallesta的答案一致,您可以执行以下操作:

sql = 'SELECT {col_name} FROM structures WHERE id = ?'.format(col_name=colname)
cursor.execute(sql, [n])

它使用了两种约定的混合

使用混合:
cursor.execute(“从结构中选择{col_name},其中id==?”,(col_name,n))
。防止注入的位是值,而不是列名。保护该值,列名不再是问题。使用混合的:
游标。执行(“从id==?,(colu name,n)的结构中选择{colu name}”)
。防止注入的位是值,而不是列名。保护该值,列名不再是问题。