2012-01-20 18 views
1

csvファイルからデータを取り出し、同じデータベース内の2つのmysqlテーブルにインポートする必要があります。Pythonを使用した2つのMYSQLテーブルへのCSVデータ

CSVファイル:

username,password,path 
FP_Baby,7tO0Oj/QjRSSs16,FP_Baby 
lukebryan,uu00U62SKhO.sgE,lukebryan 
saul,r320QdyLJEXKEsQ,saul 
jencarlos,LOO07D5ZxpyzMAg,jencarlos 
abepark,HUo0/XGUeJ28jaA,abepark 

CSVからは

usernameを提出し、password USERSテーブルに pathを行くUSERSテーブルが

INSERT INTO `USERS` (`userid`, `username`, `password`, `server_group`) VALUES 
(23, 'username', 'password', 'MainUsers'), 

INSERT INTO `VFS_PERMISSIONS` (`userid`, `path`, `privs`) VALUES 
(23, '/path/', '(read)(write)(view)(delete)(resume)(share)(slideshow)(rename)(makedir)(deletedir)'), 
のように見えるVFS_PERMISSIONSテーブルに

を行きます可能であれば210

私は24で両方のテーブルでuseridを開始し、csvの各行に対して+1を増やしたいと思います。

これまでのところ、私はcsvファイルを読むことができますが、2つのmysqlテーブルに挿入する方法を理解できません。

#!/usr/bin/env python 
import csv 
import sys 
import MySQLdb 
conn = MySQLdb.connect(host= "localhost", 
        user="crushlb", 
        passwd="password", 
        db="crushlb") 

x = conn.cursor() 

f = open(sys.argv[1], 'rt') 
try: 
    reader = csv.reader(f) 
    for row in reader: 

    ## mysql stuff goes here right? 

finally: 
    f.close() 

答えて

2

あなたがでcursor.executeへの呼び出しの数を減らすことができます(ループで)事前に引数を準備して、ループが完了した後にcursor.executemanyを呼び出す:

cursor = conn.cursor() 
user_args = [] 
perm_args = [] 

perms = '(read)(write)(view)(delete)(resume)(share)(slideshow)(rename)(makedir)(deletedir)' 

with open(sys.argv[1], 'rt') as f: 
    for id, row in enumerate(csv.reader(f), start = 24): 
     username, password, path = row 
     user_args.append((id, username, password, 'MainUsers')) 
     perm_args.append((id, path, perms)) 

insert_users = ''' 
    INSERT IGNORE INTO `USERS` 
    (`userid`, `username`, `password`, `server_group`) 
    VALUES (%s, %s, %s, %s) 
    ''' 

insert_vfs_permissions = ''' 
    INSERT IGNORE INTO `VFS_PERMISSIONS` 
    (`userid`, `path`, `privs`) 
    VALUES (%s, %s, %s) 
    ''' 

cursor.executemany(insert_users,user_args) 
cursor.executemany(insert_vfs_permissions,perm_args) 

INSERT IGNOREは、MySQLに行をMySQLテーブルに挿入しようとしますが、競合があれば無視します。たとえば、useridがPRIMARY KEYで、すでに同じユーザーIDを持つ行がある場合、INSERT IGNORE SQLは、同じPRIMARY KEYを持つ2つの行を作成するため、新しい行を挿入するコマンドを無視します。

IGNOREを指定しないと、cursor.executemanyコマンドは例外を発生させ、行を挿入できません。

私はINSERT IGNOREを使用しました。したがって、cursor.executemany例外を発生させずにコードを複数回実行することができます。

INSERT ... ON DUPLICATE KEY UPDATEコマンドを実行するとMySQLに行が挿入されますが、競合が発生した場合は更新されますが、ON DUPLICATE KEYについて詳しく知りたい場合を除き、このままにしておきます。

+0

あなたのコードを実装しようとしましたが、このエラーがありました 'File" import_ftp_users-v2.py "、line 16 open(sys.argv [1]、 'rt')f: ^ SyntaxError:無効な構文 ' ありがとうございます、ここにコードです。 http://pastebin.com/4DxE7Jk3 –

+0

私はその行を書き留めました。それは '(f)としてオープン(...)でなければなりません。私は自分の投稿を編集して、私が意味することを示しています。 – unutbu

+0

同様のエラーは、http:// pastebinの本文をご覧ください。com/v3SqSBdZ 更新コード:http://pastebin.com/nm04u3CR ありがとう –

0

あなたはすでにあなたが実行するためにワンSQL文を知っているので、それはcursor.executeメソッドを使用するために、多かれ少なかれ簡単です:

offset = 23 
for row_number, row in enumerate(reader): 
    username, password, path = row 
    x.execute("INSERT INTO `USERS` (`userid`, `username`, `password`, `server_group`) " 
       "VALUES (%s, %s, %s, 'MainUsers')", (row_number+offset, username, password)) 
    x.execute("INSERT INTO `VFS_PERMISSIONS` (`userid`, `path`, `privs`) " 
       "VALUES (%s, %s, '(read)(write)(view)(delete)(resume)(share)(slideshow)(rename)(makedir)(deletedir)'", (row_number+offset, path)) 
+0

これを試してみましたが、プログラミングエラーが発生します。 '_mysql_exceptions.ProgrammingError:(1064、" SQL構文に誤りがあります。正しい構文については、 'at line 1'の近くでMySQLサーバのバージョンに対応するマニュアルをチェックしてください) '私が何をしようとしているのかを見てくださいここでは:http://pastebin.com/gHQkGdHs –