2

現在、リストの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

4 に答える 4

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')]
于 2011-05-06T01:00:12.270 に答える
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)
于 2011-05-06T01:08:03.197 に答える
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だったと思います) .

于 2011-05-06T01:07:33.373 に答える
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 が機能する可能性があります。

于 2011-05-06T01:08:13.357 に答える