【发布时间】:2015-08-19 17:23:02
【问题描述】:
使用 Python 的 sqlite3 库,我可以在 SQL 语句中拥有可变数量的占位符吗:
INSERT INTO table VALUES (?,?)`
其中? 是占位符,它可以免受SQL injection 攻击吗?
我希望能够有一个通用函数(如下)来检查列数并将数据写入一行,但它可以适用于具有任意列数的任何表。
我看了:
Python Sqlite3: INSERT INTO table VALUE(dictionary goes here) 和
PHP MYSQL 'INSERT INTO $table VALUES ......' variable number of fields
但我还是不确定。
def rowin(self, TableName, ColumnData=[]):
# First check number columns in the table TableName to confirm ColumnData=[] fits
check = "PRAGMA table_info(%s)"%TableName
conn = sqlite3.connect(self.database_file)
c = conn.cursor()
c.execute(check)
ColCount = len(c.fetchall())
# Compare TableName Column count to len(ColumnData)
if ColCount == len(ColumnData):
# I want to be have the number of ? = ColCount
c.executemany('''INSERT INTO {tn} VALUES (?,?)'''.format(tn=TableName), ColumnData)
conn.commit()
else:
print("Input doesn't match number of columns")
【问题讨论】:
-
",".join(["?"] * ColCount) 将创建一个字符串“?,?,?”,其中有多少个?字符匹配 ColCount。这有帮助吗?
-
是的。谢谢!我最终首先做了一个 for 循环:for cols in range(1,len(ColumnData)): qmark += ",?"后跟:c.execute('''INSERT INTO {tn} VALUES ({q})'''.format(tn=TableName, q=qmark),ColumnData)