查询

 本章节将讲述在关系数据库的基本CRUD操作

  • Model.create(),执行Insert操作
  • Model.save()和Model.update(),执行Update操作
  • Model.delete_instance()和Model.delete(),执行Delete操作
  • Model.select(),执行Select操作

新增记录

  使用Model.create()新增模型实例。方法接受关键字参数,关键字名字关联到模型类的字段名称。返回实例,并且表中增加一行。

 

>>> User.create(username='Charlie')
<__main__.User object at 0x2529350>

 

这将插入新行记录。主键自动返回存储在模型实例上。

你也可以用代码构造一个模型实例,然后调用save方法:

peewee查询6_User

>>> user = User(username='Charlie')
>>> user.save() # save() returns the number of rows modified.
1
>>> user.id
1
>>> huey = User()
>>> huey.username = 'Huey'
>>> huey.save()
1
>>> huey.id
2

当模型有外键时,你可以直接将外键对应的模型实例赋值到外键字段。

tweet = Tweet.create(user=huey, message='Hello!')

也可以将外键对应模型实例的主键赋值到字段:

>>> tweet = Tweet.create(user=2, message='Hello again!')

如果你想简单的插入行但不需要创建模型实例,可以使用Model.insert():

>>> User.insert(username='Mickey').execute()
3

 

执行插入查询以后,新插入行的主键返回。

批量插入

有几种快速插入的方法。最直接的方法就是循环调用Model.create()

data_source = [
{'field1': 'val1-1', 'field2': 'val1-2'},
{'field1': 'val2-1', 'field2': 'val2-2'},
# ...
]

for data_dict in data_source:
Model.create(**data_dict)

以上方法较慢,有如下原因:

  1. 如果你用默认的自动提交,每当调用create方法时时,都会提交事务,所以这样很慢。
  2. 这种方法有少量的Python逻辑,而且每次都会有InsertQuery生成并且被解析为SQL语句。
  3. 发往数据库有许多数据而不是SQL原生字节需要数据库解析
  4. 我们得到了最后插入的id在某些情况下会引起额外的查询。

可以简单的在一个原子操作中包装而得到显著的速度提升。

# This is much faster.
with db.atomic():
for data_dict in data_source:
Model.create(**data_dict)

还不够快,可以使用insert_many()。接受字典list作参数。

 

根据你的数据源的行数。可以将批量操作分割成块。

# Insert rows 1000 at a time.
with db.atomic():
for idx in range(0, len(data_source), 1000):
Model.insert_many(data_source[idx:idx+1000]).execute()

如果你想要插入的数据存储在另一张表中,你也可以创建一个INSERT查询,它的插入数据源是一个SELECT查询。用Model.insert_from()方法

query = (TweetArchive
.insert_from(
fields=[Tweet.user, Tweet.message],
query=Tweet.select(Tweet.user, Tweet.message))
.execute())