Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实现生成器以填充数据库_Python_Database_Generator - Fatal编程技术网

Python 实现生成器以填充数据库

Python 实现生成器以填充数据库,python,database,generator,Python,Database,Generator,我不能完全控制发电机,有时我碰巧以正确的方式使用它们,有时我不这样做 我正在从.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)

我不能完全控制发电机,有时我碰巧以正确的方式使用它们,有时我不这样做

我正在从.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)
运行此命令时,只有第一行被插入到数据库中。您可以建议如何修复它吗?

process\u csv(filecsv)
在用户上返回迭代器
insert
将迭代器转换为列表,并显式获取第一项。(注释是错误的;它不是一个单元素列表。)相反,在用户上循环并插入每个用户:

def insert(cur, users): 
    for user in users:
        cur.execute("INSERT INTO users (name, location) VALUES(%s, %s)", 
        (user.name, user.location))
请注意,执行此数据库操作几乎肯定有更好的方法。这个答案只解决了生成器问题。

process\u csv(filecsv)
在用户上返回迭代器
insert
将迭代器转换为列表,并显式获取第一项。(注释是错误的;它不是一个单元素列表。)相反,在用户上循环并插入每个用户:

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

请注意,执行此数据库操作几乎肯定有更好的方法。这个答案只解决了发电机问题。

我想你离目标还不远, 试试这个:

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)

Generator是一个迭代器,所以你应该像迭代器一样使用它,我想你离目标不远了, 试试这个:

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)

Generator是迭代器,因此您应该像迭代器一样使用它

我们看不到如何调用这两个函数。特别是,它们似乎没有联系;他们两个都不给对方打电话。这些功能是如何关联的?只是说,如果这是一次性工作,大多数数据库都有直接从CSV文件导入的功能。e、 我们看不出这两个函数是如何调用的。特别是,它们似乎没有联系;他们两个都不给对方打电话。这些功能是如何关联的?只是说,如果这是一次性工作,大多数数据库都有直接从CSV文件导入的功能。e、 g.和