Python to SQL:列表列表

时间:2011-05-06 00:51:21

标签: python mysql mysql-python

我目前在将python列表导出到mySQL DB时遇到问题。 我使用MySQLdb并使用executemany命令。

例如,我有一个列表清单:

k1=[[['Bob', 'Alfred', 'Jen'],
['123 Elm Street', '55 Ninth Ave', '1 Paved Rd'],
[00123, 34565, 30094],
['Newark', 'Salinas', 'Los Angeles'],
['NJ', 'CA', 'CA']],[['Bob1', 'Alfred1', 'Jen1'],
['123 Elm Street1', '55 Ninth Ave1', '1 Paved Rd1'],
[001231, 345651, 300941],
['Newark1', 'Salinas1', 'Los Angeles1'],
['NJ1', 'CA1', 'CA1']]]

我尝试(在初始化光标和要使用的数据库之后):

cursor.executemany('''INSERT INTO addresses
                 (name, street, zipcode, city, state)
                 VALUES
                 (%s, %s, %s, %s, %s)''',zip(k1))

,我收到了错误消息:

 _mysql_exceptions.ProgrammingError: not enough arguments for format string

嗯,基本上,我想从名单,街道,邮政编码,城市和状态列表中列出k1到mySQL db表“地址”以及相应的字段条目。

如果有人能指出我正确的方向,那将会很棒。

4 个答案:

答案 0 :(得分:3)

我认为这不是一个SQL问题;在尝试调用executemany()之前,让我们专注于以正确的形式获取数据。

您的k1示例是一个包含2个列表的列表,每个列表都是列表列表,列表是名称/地址组件。所以你实际上有一个列表列表。我不知道列表的外层是什么意思,但内层似乎可以拉链。

忽略那个外层,我想你想要的是

zip(*k1[0])

这为k1中的第一个元素产生了看样效果。同样,我不知道在k1 [0]和k1 [1]中重复相同数据的目的是什么,所以我不会试图猜测你将如何处理k1中的其他元素。

同样,在担心如何将其与SQL数据库集成之前,只需尝试在python解释器中使用它:

>>> k1=[[['Bob', 'Alfred', 'Jen'],['123 Elm Street', '55 Ninth Ave', '1 Paved Rd'],[00123, 34565, 30094],['Newark', 'Salinas', 'Los Angeles'],['NJ', 'CA', 'CA']],[['Bob1', 'Alfred1', 'Jen1'],['123 Elm Street1', '55 Ninth Ave1', '1 Paved Rd1'],[001231, 345651, 300941],['Newark1', 'Salinas1', 'Los Angeles1'],['NJ1', 'CA1', 'CA1']]]
>>> zip(k1)
[([['Bob', 'Alfred', 'Jen'], ['123 Elm Street', '55 Ninth Ave', '1 Paved Rd'], [83, 34565, 30094], ['Newark', 'Salinas', 'Los Angeles'], ['NJ', 'CA', 'CA']],), ([['Bob1', 'Alfred1', 'Jen1'], ['123 Elm Street1', '55 Ninth Ave1', '1 Paved Rd1'], [665, 345651, 300941], ['Newark1', 'Salinas1', 'Los Angeles1'], ['NJ1', 'CA1', 'CA1']],)]
>>> k1[0]
[['Bob', 'Alfred', 'Jen'], ['123 Elm Street', '55 Ninth Ave', '1 Paved Rd'], [83, 34565, 30094], ['Newark', 'Salinas', 'Los Angeles'], ['NJ', 'CA', 'CA']]
>>> k = k1[0]
>>> zip(k)
[(['Bob', 'Alfred', 'Jen'],), (['123 Elm Street', '55 Ninth Ave', '1 Paved Rd'],), ([83, 34565, 30094],), (['Newark', 'Salinas', 'Los Angeles'],), (['NJ', 'CA', 'CA'],)]
>>> zip(k[0], k[1])
[('Bob', '123 Elm Street'), ('Alfred', '55 Ninth Ave'), ('Jen', '1 Paved Rd')]
>>> zip(k[0], k[1], k[2], k[3], k[4])
[('Bob', '123 Elm Street', 83, 'Newark', 'NJ'), ('Alfred', '55 Ninth Ave', 34565, 'Salinas', 'CA'), ('Jen', '1 Paved Rd', 30094, 'Los Angeles', 'CA')]
>>> zip(*k)
[('Bob', '123 Elm Street', 83, 'Newark', 'NJ'), ('Alfred', '55 Ninth Ave', 34565, 'Salinas', 'CA'), ('Jen', '1 Paved Rd', 30094, 'Los Angeles', 'CA')]

答案 1 :(得分:3)

您的数据结构非常尴尬。我假设你想把k1变成这个:

>>> sum([zip(*x) for x in k1], [])
<<< 
[('Bob', '123 Elm Street', 83, 'Newark', 'NJ'),
 ('Alfred', '55 Ninth Ave', 34565, 'Salinas', 'CA'),
 ('Jen', '1 Paved Rd', 30094, 'Los Angeles', 'CA'),
 ('Bob1', '123 Elm Street1', 665, 'Newark1', 'NJ1'),
 ('Alfred1', '55 Ninth Ave1', 345651, 'Salinas1', 'CA1'),
 ('Jen1', '1 Paved Rd1', 300941, 'Los Angeles1', 'CA1')]

现在你可以执行executemany:

sql = "INSERT INTO addresses (name, street, zipcode, city, state) VALUES (%s, %s, %s, %s, %s)"
data = sum([zip(*x) for x in k1], [])
cursor.executemany(sql, data)

答案 2 :(得分:1)

我认为你的意思是将k1中的每个列表(每个列表都包含几个列表)传递给zip,如下所示:

>>> [zip(*x) for x in k1]
[[('Bob', '123 Elm Street', 83, 'Newark', 'NJ'), ('Alfred', '55 Ninth Ave', 34565, 'Salinas', 'CA'), ('Jen', '1 Paved Rd', 30094, 'Los Angeles', 'CA')], [('Bob1', '123 Elm Street1', 665, 'Newark1
', 'NJ1'), ('Alfred1', '55 Ninth Ave1', 345651, 'Salinas1', 'CA1'), ('Jen1', '1 Paved Rd1', 300941,   'Los Angeles1', 'CA1')]]
>>> 

另请注意,您的邮政编码应该是字符串,而不是数字,以保留前导零,并避免将它们误解为您不想要的东西(请参阅那里的'83'邮政编码?它是00123我相信)。

答案 3 :(得分:0)

如果您的数据结构如下所示:(不是格式化而是组织。您需要表示行而不是列来插入SQL。)

[        
    ['Bob',     '123 Elm Street',  00123, 'Newark',     'NJ'],        
    ['Alfred',   '55 Ninth Ave',    34565, 'Salinas',   'CA'],
    ['Jen',     '1 Paved Rd',      30094, 'Los Angeles','CA']
]

您的SQL INSERT可能有效。