Peewee和插入列表

时间:2017-05-12 18:22:55

标签: python peewee

我对如何使用Peewee将元组列表插入数据库感到困惑。我的数据库设置如下:

class Stats(Model):
    name = TextField(index=True)
    gender = TextField()
    age = TextField()
    city = TextField()
    state = TextField()

    class Meta:
        database = db

我的元组列表如下所示:

records = [("Joe Smoe", "Male", 34, "Joe City", "Joe State")],
          [("Jane Doe", "Female", 21, "Jane City", "Jane State")]

我是否迭代一次插入一行的列表?这可以是批量插入还是需要制作成dict来做到这一点?

2 个答案:

答案 0 :(得分:1)

可以迭代列表并一次插入一行,但是使用peewee的Model.insert_many函数用单个SQL进行批量插入会更好更高效INSERT声明。是的,根据这些API文档,insert_many()需要一个列表(或任何可迭代的)dict个对象,每个对象必须具有相同的密钥。

您可以手动执行此操作,如下所示:

rows = [
    {"name": "Joe Smoe", "gender": "Male", "age": 34,
     "city": "Joe City", "state": "Joe State"},
    {"name": "Jane Doe", "gender": "Female", "age": 21,
     "city": "Jane City", "state" :"Jane State"},
    ...
]
Stats.insert_many(rows)

或者,如果您已经有问题中显示的records元组列表,则可以使用Model._meta.sorted_field_names迭代Stats模型的字段名称来构建字符串:

# Be sure to exclude the implicit primary key field
fields = [name for name in Stats._meta.sorted_field_names if name != 'id']
rows = [dict(zip(fields, record)) for record in records]
Stats.insert_many(rows)

答案 1 :(得分:0)

我最终只取了单个列表并使用dict comp将它们转换为dict进行插入。所以它看起来像这样:

name_list = ['Joe Smoe', 'Jane Doe']
gender_list = ['male', 'female']
age_list = [34, 21]
city_list = ['Joe City', 'Jane City']
state_list = ['Joe State', 'Jane State']

completed_dict = [{
                 'name': a, 'gender': b, 'age': c, 'city': d, 'state': e}
                 for a, b, c, d, e, in zip(name_list, gender_list,  age_list, city_list, state_list)]

with db.atomic():
    Stats.insert_many(completed_dict).execute()

不确定这是否是最好的方法,但它对我来说效果很好。