我正在使用python 3.7和sqlite3将数据写入我的数据库。我有这个功能
def add_item(self, item):
stmt = "INSERT INTO users (id) VALUES (?)"
args = (item,)
self.conn.execute(stmt, args)
self.conn.commit()
它工作正常,但只允许我将数据写入id列。如何使该函数动态化,以便可以将任何数据添加到任何列?
# new variable to specify column to write to
def add_item(self, item, column):
stmt = "INSERT INTO users (column) VALUES (?)"
args = (item,)
self.conn.execute(stmt, args)
self.conn.commit()
答案 0 :(得分:1)
您需要根据提供的列和值列表的长度动态构建列名和值占位符列表。
这可以使用str.join完成,但是您可能需要处理调用者传递单个字符串作为列名和单个值的情况。
def add_item(self, values, columns):
# Check for single column insert
if isinstance(columns, str):
values, columns = (values,), (columns,)
assert len(values) == len(columns), 'Mismatch between values and columns'
template = """INSERT INTO users ({}) VALUES ({})"""
cols = ','.join([f'"{col}"' for col in columns])
placeholders = ','.join(['?'] * len(values))
stmt = template.format(cols, placeholders)
self.conn.execute(stmt, values)
self.conn.commit()
return