SQLite:用Python替换参数和字段名
一般来说,我对SQL和sqlite3比较陌生,对于在执行中使用问号或命名样式有疑问 我有几个数据库,其中有一个名为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
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}”)
。防止注入的位是值,而不是列名。保护该值,列名不再是问题。