2013-12-11 3 views
0

Я не могу полностью окутать голову генераторам, иногда я использую их правильно, а иногда и нет.Реализация генераторов для заполнения базы данных

Я заселять БД из файла .csv:

name, location 
Tom, France 
Doug, USA 
Michael, UK 

Вот мой код:

def process_csv(filecsv): 
    f = open(filecsv) 
    f_csv = csv.reader(f) 
    headers = next(f_csv) 
    User = namedtuple('User', headers) 
    for user in f_csv: 
     user = [u.strip() for u in user] 
     user = User(*user) 
     yield user 

def insert(cur, user): 
    u = list(user)[0] # it's a one-elem list so take it 
    cur.execute("INSERT INTO users (name, location) VALUES(%s, %s)", 
    (u.name, u.location)) 


if __name__ == '__main__': 
    cur = cxn.cursor() 
    user = process_csv(filecsv) 
    insert(cur, user) 

При запуске этого, только первая строка была вставлена ​​в дб. Не могли бы вы посоветовать, как это исправить?

+1

Мы не можем видеть, как вызывается любая из этих функций. В частности, они, похоже, не связаны; ни один из них не называет другого. Как связаны эти функции? – user2357112

+0

Извините, обновлено сейчас. – nutship

+1

Просто сказать, что если это одноразовое задание, большинство баз данных имеют функции импорта напрямую из файлов CSV. например http://sqlite.org/cvstrac/wiki?p=ImportingFiles и http://dev.mysql.com/doc/refman/5.1/en/load-data.html – YXD

ответ

2

process_csv(filecsv) возвращает итератор по пользователям. insert превращает итератор в список и явно берет первый элемент. (Комментарий не так, это не список 1-элемента). Вместо этого перебирает пользователь и заведите один:

def insert(cur, users): 
    for user in users: 
     cur.execute("INSERT INTO users (name, location) VALUES(%s, %s)", 
     (user.name, user.location)) 

Обрати внимание, что есть почти наверняка более эффективные способы выполнения этой операции с базой данных. Этот ответ касается только проблемы с генератором.

2

Вы не так далеко от своей цели я думаю, попробовать это:

def process_csv(filecsv): 
    f = open(filecsv) 
    f_csv = csv.reader(f) 
    headers = next(f_csv) 
    User = namedtuple('User', headers) 
    for user in f_csv: 
     user = [u.strip() for u in user] 
     user = User(*user) 
     yield user 

def insert(cur, user): 
    cur.execute("INSERT INTO users (name, location) VALUES(%s, %s)", 
    (user.name, user.location)) 

if __name__ == '__main__': 
    cur = cxn.cursor() 
    for user in process_csv(): 
     insert(cur,user) 

generateur итератор, поэтому вы должны использовать его как итератор

Смежные вопросы