我对如何使用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来做到这一点?
答案 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()
不确定这是否是最好的方法,但它对我来说效果很好。