赞
踩
Peewee是一个简单小巧的Python ORM(对象关系映射 Object Relational Mapping,简称ORM),支持SQLite、MySQL、PostgreSQL等数据库,本文主讲前两者。
from peewee import * # test为数据库名,并需安装mysql库 db = MySQLDatabase("test", **{'charset': 'utf8', 'use_unicode': True, 'host': 'localhost', 'user': 'root', 'password': '***'}) # 基类 class BaseModel(Model): class Meta: database = db # 表类 class Test(BaseModel): id = IntegerField(primary_key=True) name = CharField() gender = CharField() class Meta: # 表名 table_name = 'Test' # 创建表 def create_table(table): if not table.table_exists(): table.create_table() # 删除表 def drop_table(table): if table.table_exists(): table.drop_table() # 创建一张Test表 create_table(Test)
# 数据库文件路径
db_path = "../database/test.db"
db = SqliteDatabase(db_path)
# PostgreSQL数据库则调用PostgresqlDatabase方法即可
# db = PostgresqlDatabase('test', user='postgres')
创建完毕可以通过PyCharm自带的Database查看数据库,也可以使用其它软件查看
列举常用操作,即增删改查,其它操作后续慢慢补充
t = Tset(name="test", gender="男") t.save() # 或者 t = Test() t.name = "test" t.gender = "男" t.save() # insert() 只插入数据,不返回对象实例 Test.insert(name="test", gender="男").excute() # insert_many() 插入多行,rows为元组或字典列表,fields为需要插入的字段名list列表 rows = [ {"name": "test1", "gender": "男"}, {"name": "test2", "gender": "女"} ] insert_many(rows, fields=None).execute() # 或 rows = [ {"test1", "男"}, {"test2", "女"} ] fields = ["name", "gender"] insert_many(rows, fields=fields).execute()
# where()是条件,execute()是执行
Test.delete().where(Test.name == "test").execute()
# 已经实例化的数据, 使用delete_instance()
t = Tset(name="test", gender="男").save()
t.delete_instance()
找到了会返回model实例,未找到会抛出异常DoesNotExist
# 查询单条数据,多条件用逗号或逻辑运算符隔开,也支持其它比较符(大于小于等) t = Test.get(Test.name == "test") # 使用where().get()查询 t = Test.select().where(Test.name == "test").get() # 查询多条数据 tests = Test.select().where(Test.gender == "男") # 迭代结果 for t in tests: t.save() # in操作 tests = Test.select().where(Test.gender.in_(["男"])) # 通过id获取 t = Test.get_by_id(1) # 尝试获取,不存在则创建,t为实例,created为是否创建 # 参数name为自定义查询条件,dafaults并非查询条件,而是创建字段 t, created = Test.get_or_create(name="test", defaults={"gender": "男"}) # {"gender": "男"}也可以写作dict(gender="男") # 查询结果转字典dicts t = Test.select().dicts() # 只返回元组迭代器tuples t = Test.select().tuples()
查询条件支持的比较符和运算符
符号 | 含义 |
---|---|
& | 与 |
| | 或 |
~ | 非 |
== | 等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
!= | 不等于 |
<< | x in y,其中 y 是列表或查询 |
>> | x is y,其中 y 可以是 None |
% | x like y,where(Test.name % “a*”)区分大小写 |
** | x like y,where(Test.name ** “a%”)不区分大小写 |
其它查询条件,如
tests = Test.select().where(Test.name.contains("t"))
.in_(value) IN查找(与相同<<)。
.not_in(value) 不在查询中。
.is_null(is_null) 是NULL还是IS NOT NULL。接受布尔参数。
.contains(substr) 通配符搜索子字符串。
.startswith(prefix) 搜索以开头的值prefix。
.endswith(suffix) 搜索以结尾的值suffix。
.between(low, high) 在low和之间搜索值high。
.regexp(exp) 正则表达式匹配(区分大小写)。
.iregexp(exp) 正则表达式匹配(不区分大小写)。
.bin_and(value) 二进制AND。
.bin_or(value) 二进制或。
.concat(other) 使用串联两个字符串或对象||。
.distinct() 标记列以进行DISTINCT选择。
.collate(collation) 用给定的排序规则指定列。
.cast(type) 将列的值强制转换为给定的类型。
# 已经实例化的数据,直接修改对象属性并save()
t = Tset(name="test", gender="男").save()
t.gender = "女"
t.save()
# 查询后并用update()更新
t = Tset.update({Tset.gender: "女"}).where(Person.name == "test")
t.execute()
# 查询出对象并修改属性
t = Test.get(Test.name == 'test')
t.gender = "女"
t.save()
# 使用order_by()进行排序,多个字段用分号隔开 tests = Test.select().order_by(Test.id) # 升序(默认) tests = Test.select().order_by(Test.id.asc()) tests = Test.select().order_by(+Test.id) # 降序 tests = Test.select().order_by(Test.id.desc()) tests = Test.select().order_by(-Test.id) # 使用count()进行统计 n = Test.select().count() # 执行原生语句 name = "test" gender = "男" Test.raw('SELECT * FROM test WHERE name= %s and gender = %s', name, gender) # fn操作 # 1.Avg 平均值 # 2.Sum 和 # 3.Max 最大值 # 4.Min 最小值 # 5.Count 合计 # 6.Substr 切片 t= Test.select(fn.MAX(Test.id))
创建表格时的常用类型
AutoField:integer
JsonField: 8字节
MediumJSONField: 16字节
UUIDField:varchar(40)
CharField:varchar
IntegerField:integer
DecimalField:numeric
TextField:text
DateTimeField:datetime
DateField:date
TimeField:time
FixedCharField:char
BigAutoField:bigint
BigIntegerField:bigint
SmallIntegerField:smallint
IdentityField:not supported
FloatField:real
DoubleField:double precision
BlobField:blob
BitField:bigint
BigBitField:blob
BinaryUUIDField:varbinary(16)
TimestampField:integer
IPField:bigint
BooleanField:bool
BareField:not supported
ForeignKeyField:integer
ManyToManyField:无
创建表格时的常用字段
null = False 是否允许空字符串。
index = False 是否创建普通索引。
unique = False 是否创建唯一索引。
column_name = None 在数据库中指定列的名称,一般不设置会使用定义model时的变量名作为列名。
default = None 设置默认值。
primary_key = False 是否为主键。
constraints = None 增加约束,如果增加,该值是一个列表。
collation = None 用于排序字段或索引的排序规则。
choices = None 设置可选的枚举选项,值是一个元组,元素也是一个元组,例如((1,‘女’),(2,‘男’))。
help_text = None 设置备注或注释文本。
verbose_name = None 设置一个可读性良好的名称,例如 name = CharField(verbose_name = ‘用户名’)。
index_type = None 指定索引类型,不常用,一般默认即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。