python sqlite:写一个大列表到sqlite数据库

问题描述:

我是新来的sqlite和我认为这个问题应该已经回答之前,但我还没有能够找到答案。 我有一个约50个元素的列表,我需要写入一个sqlite数据库与50列。 检查了文档@https://docs.python.org/2/library/sqlite3.html,但在示例中,值由? ?(因此对于写入3个值,3被指定python sqlite:写一个大列表到sqlite数据库

示例代码:

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

+0

请提供证明该错误的短,完整的程序以便其他人可能会重现您的问题。 – 2014-09-26 20:19:36

假设你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() 
+0

试过这个并且工作!正是我正在寻找...谢谢一吨 – anna1983 2014-09-26 21:10:05

您需要指定列的名称。 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中的每个值都有其自己的行,并且对于每行都会有两列:值的列和名称。

+0

“*您需要指定列的名称*” - 不完全。如果问号的数量与表中的列数相同,则列名可以省略。参考:http://www.sqlite.org/lang_insert.html – 2014-09-26 20:35:12

+0

@Robᵩ:没错,但OP说每行都有“*周围* 50个元素”。所以这听起来像'row_to_write'没有*完全* 50个元素。 – unutbu 2014-09-26 20:41:10

+0

这个评论是非常有帮助的,因为它把我放在正确的方向 – anna1983 2014-09-26 21:10:46