pythonsqlite:向sqlite数据库写入一个大列表

2024-10-06 12:17:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新来的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()

试过这些:

方法1

c.execute("INSERT INTO PMU VALUES (?)", row_to_write) ERROR: OperationalError: table PMU has 50 columns but 1 values were supplied

方法2…尝试编写一个遍历列表的生成器

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 正确的方法是什么?在


Tags: tosample方法元素列表sqliteconnsqlite3
2条回答

您需要指定列的名称。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个名称中的一个(以前是列名)。row_to_write中的每个值都有自己的行,对于每一行,您将有两列:值和列的名称。在

假设您的row_to_write的项数与PMU的列数完全相同,那么可以使用str.join:','.join(['?']*len(row_to_write))轻松地创建一个?标记的字符串

import sqlite3

conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute("create table PMU (%s)" % ','.join("col%d"%i for i in range(50)))

row_to_write = list(range(100,150,1))
row_value_markers = ','.join(['?']*len(row_to_write))
c.execute("INSERT INTO PMU VALUES (%s)"%row_value_markers, row_to_write)

conn.commit()

相关问题 更多 >