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 指定索引类型,不常用,一般默认即可。