我是sqlite的新手,我认为这个问题应该在之前得到解答,但我还没有找到答案。 我有一个大约50个元素的列表,我需要写入一个50列的sqlite数据库。 浏览了文档@ https://docs.python.org/2/library/sqlite3.html,但在示例中,值是由?指定的? (因此,对于写入3个值,指定3?
示例代码:
row_to_write = range(50)
conn = sqlite3.connect('C:\sample_database\sample_database')
c = conn.cursor()
试过这些:
c.execute("INSERT INTO PMU VALUES (?)", row_to_write)
ERROR: OperationalError: table PMU has 50 columns but 1 values were supplied
def write_row_value_generator(row_to_write):
for val in row_to_write:
yield (val,)
c.executemany("INSERT INTO PMU VALUES (?)", write_row_value_generator(row_to_write))
ERROR: OperationalError: table PMU has 50 columns but 1 values were supplied
这样做的正确方法是什么?
答案 0 :(得分:0)
您需要指定列的名称。 Sqlite不会为你猜那些。
columns = ['A', 'B', 'C', ...]
n = len(row_to_write)
sql = "INSERT INTO PMU {} VALUES ({})".format(
', '.join(columns[:n]) , ', '.join(['?']*n))
c.execute(sql, row_to_write)
另请注意,如果您的行具有可变数量的列,那么您可能需要重新考虑数据库架构。通常每行应该有固定数量的列,并且可变性表示插入的行数,而不是使用的列数。
例如,您可能只需要一个额外的列,而不是50列,其值为50个名称之一(以前是列名)。 row_to_write
中的每个值都有自己的行,对于每一行,您将有两列:列的值和名称。
答案 1 :(得分:0)
假设您的row_to_write
与PMU
列的列数完全相同,则可以使用?
轻松创建str.join
标记字符串:{{1 }}
','.join(['?']*len(row_to_write))