#Sora#peewee query 笔记

这部分是query相关的笔记:

peewee————查询

1.创建单条记录(有多种方法):

准备:

>>> from peewee import *

>>> db = MySQLDatabase(‘vmrecord‘,host=‘localhost‘,port=3306,user=‘root‘,password=‘root‘)

class test1(Model):

username = CharField()

class Meta:

database = db

db.connect()

方法一:

>>> test1.create(username=‘hoci‘)

<__main__.test1 object at 0x7fdd1d637650>

方法二:

>>> user = test1(username=‘liso‘)

>>> user.save()

1

方法三:

>>> user1 = test1()

>>> user1.username = ‘jack‘

>>> user1.save()

1

如果model有外键,创建新记录时可以直接指定外键field:

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

或引用其主键:

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

(例子来自文档)

方法四:

>>> test1.insert(username=‘michelle‘).execute()

4L               #返回主键中的新行号数

2.创建多条记录(批量插入):

最快的方法:

>>> data = [{‘username‘:‘sla‘},{‘username‘:‘saf‘},{‘username‘:‘djangs‘}]

>>> data

[{‘username‘: ‘sla‘}, {‘username‘: ‘saf‘}, {‘username‘: ‘djangs‘}]

>>> with db.atomic():

...   test1.insert_many(data).execute()

...

True

如果你要手动遍历data再执行insert,效率会慢得多,文档举的更慢例子:

较慢:

with db.atomic():

for data_dict in data_source:

Model.create(**data_dict)

更慢:

data_source = [

{‘field1‘: ‘val1-1‘, ‘field2‘: ‘val1-2‘},

{‘field1‘: ‘val2-1‘, ‘field2‘: ‘val2-2‘},

# ...

]

for data_dict in data_source:

Model.create(**data_dict)

如果数据的确比较大,可以分段插入:

with db.atomic():

for idx in range(0, len(data_source), 1000):

Model.insert_many(data_source[idx:idx+1000]).execute()

也可以引用其他的数据插入:

query = (TweetArchive

.insert_from(

fields=[Tweet.user, Tweet.message],

query=Tweet.select(Tweet.user, Tweet.message))

.execute())

mysql> select * from test1;

+----+----------+

| id | username |

+----+----------+

|  1 | hoci     |

|  2 | liso     |

|  3 | jack     |

|  4 | michelle |

|  6 | sla      |

|  7 | saf      |

|  8 | djangs   |

+----+----------+

3.更新记录:

如果反复执行某一个model实例的save方法,只会执行update,而不是insert

执行查询更新:

先插入记录:

>>> test1.insert(username=‘ka‘)

检查:

mysql> select * from test1;

+----+----------+

| id | username |

+----+----------+

|  1 | hoci     |

|  2 | liso     |

|  3 | jack     |

|  4 | michelle |

|  6 | sla      |

|  7 | saf      |

|  8 | djangs   |

|  9 | ka       |

+----+----------+

更新id为9的username:

>>> query = test1.update(username=‘kafla‘).where(test1.id == 9)

>>> query.execute()

1L

检查:

mysql> select * from test1;

+----+----------+

| id | username |

+----+----------+

|  1 | hoci     |

|  2 | liso     |

|  3 | jack     |

|  4 | michelle |

|  6 | sla      |

|  7 | saf      |

|  8 | djangs   |

|  9 | kafla    |

+----+----------+

8 rows in set (0.00 sec)

官方例子:

>>> today = datetime.today()

>>> query = Tweet.update(is_published=True).where(Tweet.creation_date < today)

>>> query.execute()  # Returns the number of rows that were updated.

4

其他例子:

>>> query = Stat.update(counter=Stat.counter + 1).where(Stat.url == request.url)

>>> query.execute()

>>> query = Employee.update(bonus=(Employee.bonus + (Employee.salary * .1)))

>>> query.execute()  # Give everyone a bonus!

使用子查询与数据库函数的例子:

>>> subquery = Tweet.select(fn.COUNT(Tweet.id)).where(Tweet.user == User.id)

>>> update = User.update(num_tweets=subquery)

>>> update.execute()

4.删除记录:

使用delete_instance():

>>> user = test1.get(test1.id == 9)

>>> user.delete_instance()

1L

mysql> select * from test1;

+----+----------+

| id | username |

+----+----------+

|  1 | hoci     |

|  2 | liso     |

|  3 | jack     |

|  4 | michelle |

|  6 | sla      |

|  7 | saf      |

|  8 | djangs   |

+----+----------+

7 rows in set (0.00 sec)

或者用where配合delete:

>>> query = test1.delete().where(test1.username == ‘djangs‘).execute()

mysql> select * from test1;

+----+----------+

| id | username |

+----+----------+

|  1 | hoci     |

|  2 | liso     |

|  3 | jack     |

|  4 | michelle |

|  6 | sla      |

|  7 | saf      |

+----+----------+

6 rows in set (0.00 sec)

5.获取记录:

使用get():

>>> test1.get(test1.id == 1)

<__main__.test1 object at 0x7f39baa03bd0>

>>> test1.get(test1.id == 1).username

u‘hoci‘

>>> test1.get(test1.id == 1).username

u‘hoci‘

>>> ob = test1.get(test1.username == ‘jack‘)

>>> ob.username

u‘jack‘

>>> ob.id

3

如果试图获取一个不存在的值,会报错:

>>> ob = test1.get(test1.username == ‘shit‘)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "/usr/local/lib/python2.7/dist-packages/peewee.py", line 4012, in get

return sq.get()

File "/usr/local/lib/python2.7/dist-packages/peewee.py", line 2645, in get

% self.sql())

peewee.test1DoesNotExist: Instance matching query does not exist:

SQL: SELECT `t1`.`id`, `t1`.`username` FROM `test1` AS t1 WHERE (`t1`.`username` = %s)

PARAMS: [u‘shit‘]

你也可以在查询中调用get():

(官方例子)

>>> (Tweet

...  .select()

...  .join(User)

...  .where(User.username == ‘charlie‘)

...  .order_by(Tweet.created_date.desc())

...  .get())

<__main__.Tweet object at 0x2623410>

6.特殊操作:

Get or create:

使用get or create时,会返回一个2元组,第一个元素是实例,第二个是一个布尔值,表示是否创建新记录:

mysql> select * from test1;

+----+----------+

| id | username |

+----+----------+

|  1 | hoci     |

|  2 | liso     |

|  3 | jack     |

|  4 | michelle |

|  6 | sla      |

|  7 | saf      |

+----+----------+

6 rows in set (0.00 sec)

>>> res = test1.get_or_create(username=‘jack‘)

>>> res

(<__main__.test1 object at 0x7f39baa03d50>, False)

>>> res[0].username

u‘jack‘

元组的第一个元素是该对象,第二个false表示没有创建新记录

创建新记录:

>>> res = test1.get_or_create(username=‘newguy‘)

>>> res

(<__main__.test1 object at 0x7f39baa03c50>, True)

>>> res[0].username

‘newguy‘

>>> res[0].id

11L

创建了新记录:

mysql> select * from test1;

+----+----------+

| id | username |

+----+----------+

|  1 | hoci     |

|  2 | liso     |

|  3 | jack     |

|  4 | michelle |

|  6 | sla      |

|  7 | saf      |

| 11 | newguy   |

+----+----------+

7 rows in set (0.00 sec)

其他内容的关键字与概要:

Selecting multiple records

(Model.select())

Filtering records

(使用比较大小类似的方式过滤)

More query examples

(例子)

Sorting records

(升降序可选)

Getting random records

(mysql使用fn.Rand()获取随机记录)

Paginating records

(实现记录分页)

Counting records

Aggregating records

(统计聚合)

SQL Functions, Subqueries and “Raw expressions”

(使用SQL表达式)

Security and SQL Injection

(有关安全与SQL注入)

Retrieving raw tuples / dictionaries

(以字典或元组的形式获取记录,配合group_by()用)

使用数据库函数的例子(用fn.FUNCTION调用):

A lot of fun things can go in the where clause of a query, such as:

A field expression, e.g. User.username == ‘Charlie‘

A function expression, e.g. fn.Lower(fn.Substr(User.username, 1, 1)) == ‘a‘

A comparison of one column to another, e.g. Employee.salary < (Employee.tenure * 1000) + 40000

You can also nest queries, for example tweets by users whose username starts with “a”:

# get users whose username starts with "a"

a_users = User.select().where(fn.Lower(fn.Substr(User.username, 1, 1)) == ‘a‘)

# the "<<" operator signifies an "IN" query

a_user_tweets = Tweet.select().where(Tweet.user << a_users)

时间: 2024-08-09 10:35:36

#Sora#peewee query 笔记的相关文章

#Sora#peewee管理数据库——笔记

终于来到sora开发准备的最后部分 peewee 管理数据库 1.明确地管理数据库连接(也可以考虑使用连接池) database = SqliteDatabase('my_app.db') def before_request_handler(): database.connect() def after_request_handler(): database.close() 务必明确地处理数据库连接 2.在表类中设置内部类,以使用数据库 class MyModel(Model): some_f

#Sora#peewee plus celery = ?

最近疯看全职猎人 初步学习了peewee,因为sqlalchemy实在是太重量级,文档也太恶心,peewee上手容易得多,也非常light 结合celery和peewee,写了点东西,查询年龄 myapp/db.py: from __future__ import absolute_import from myapp.celery import app from peewee import * db = SqliteDatabase('people.db') class Person(Model

Query意图分析:记一次完整的机器学习过程(scikit learn library学习笔记)

所谓学习问题,是指观察由n个样本组成的集合,并根据这些数据来预测未知数据的性质. 学习任务(一个二分类问题): 区分一个普通的互联网检索Query是否具有某个垂直领域的意图.假设现在有一个O2O领域的垂直搜索引擎,专门为用户提供团购.优惠券的检索:同时存在一个通用的搜索引擎,比如百度,通用搜索引擎希望能够识别出一个Query是否具有O2O检索意图,如果有则调用O2O垂直搜索引擎,获取结果作为通用搜索引擎的结果补充. 我们的目的是学习出一个分类器(classifier),分类器可以理解为一个函数,

【Query处理学习笔记】搜索引擎查询推荐技术综述_中文信息学报2010_王斌

主要内容:对通用搜索引擎的查询推荐技术的方法.评价进行了总结 具体内容: "查询推荐"的不同英文叫法:Query Suggestion.Term Suggestion.Query Recommendation.Query Substitution.Query Rewriting 查询推荐的任务:找出和用户查询相似的query,以便更好地表达用户查询意图,供用户便捷输入 三种技术方法: 1. 基于文档的方法:通过处理query搜索出来的文档,以此作为反馈,进一步理解用户意图,扩充quer

SAP sybase培训笔记4-使用技巧&&Query Plan

解释型与预编译型 1.传统的数据库,存储过程有comp的过程,IQ不做. 2.!!!存储过程性能吞吐量要比直接查询降一半. 3.IQ内部,多个语句会分析并转换成存储过程去执行.所以语句多一次执行,语句少直接逐句执行. 4. 使用索引 简化条件 选择算法 join group 行数 cpu distinct记录数 等等,决定了语法选择. 5. Query Plan开关: Query_Plan='ON', 只有叶子节点才有 condition execution set TEMPORARY OPTI

dojo 学习笔记之dojo.query - query(id) 与query(class)的区别

考虑这个例子:动态创建一个页面的时候,用new listtem()生成多个listitem, 且每个listitem中都生成一个按钮button. 如果想要给每个按钮都绑定一个click事件,用dojo.query来获取这些button是比较方便的. 这样做的时候我遇到一个问题, 在create这些button的循环语句中我给每个button 定义了id = "somebtn" . 然后试图用var btnlist = dojo.query("#somebtn")

Dynamic CRM 2015学习笔记(5)CRM 2015 导入 OData Query Designer 解决方案

以前一直使用OData Query Designer来生成.验证odata查询字符串,本想把它导入到CRM 2015的环境里,但报错: 到MSDN上发现太老版本的solution确实不能再导入到crm 2015了: 因为这个工具是crm2011版本的,根据上面的图示,我们必须把它先导到crm 2013,再在crm 2013里导出成6.1version的,这时就可以导入到crm 2015里了.但我导到crm 2013里后,再想导出时问题来了,不能导出,因为是manage的solution.必须是u

[IR课程笔记]Query Refinement and Relevance Feedback

相关反馈的两种类型: “真实”的相关反馈: 1. 系统返回结果 2. 用户提供一些反馈 3. 系统根据这些反馈,返回一些不同的,更好的结果 “假定”的相关反馈 1. 系统得到结果但是并不返回结果 2. 系统根据这些结果改善query 3. 根据改善后的query得到结果并返回 Rocchio's Modified Query Modified query vector = Original query vector + Mean of relevant documents found by or

Hibernate学习笔记(5)---Query接口

Hibernate中具有三种检索方式(HQL,QBC,SQL) Query接口 一个查询接口,用于向数据库中查询对象.并控制执行查询的过程.Query接口内封装了一个HQL查询语句. 举个栗子 //查询持久化类user Session session = sessionFactory.openSession(); //创建session实例 String hql ="from user as u where age>18"; //HQL语句,as别名可以省略不写 Query qu