查询
本章节将讲述在关系数据库的基本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方法:
>>> 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)
以上方法较慢,有如下原因:
- 如果你用默认的自动提交,每当调用create方法时时,都会提交事务,所以这样很慢。
- 这种方法有少量的Python逻辑,而且每次都会有InsertQuery生成并且被解析为SQL语句。
- 发往数据库有许多数据而不是SQL原生字节需要数据库解析
- 我们得到了最后插入的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())