当前位置: 首页 > 工具软件 > peewee > 使用案例 >

【Peewee】Python使用Peewee创建数据库

周良弼
2023-12-01

Peewee简介

Peewee是一个简单小巧的Python ORM(对象关系映射 Object Relational Mapping,简称ORM),支持SQLite、MySQL、PostgreSQL等数据库,本文主讲前两者。


创建MySQL数据库

  1. 去官网下载MySQL并启动mysql服务;
  2. 打开MySQL Workbench配置好数据库,如密码等;
  3. 在PyCharm中用Peewee创建数据库,如db_model.py;
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)

  1. 再打开MySQL Workbench就可以看到刚刚创建的Test数据库和Test表;

创建SQLite数据库

  1. SQLite数据库可以直接由Peewee创建,与上db_model.py类似,修改创建语句即可;
#  数据库文件路径
db_path = "../database/test.db"
db = SqliteDatabase(db_path)
# PostgreSQL数据库则调用PostgresqlDatabase方法即可
# db = PostgresqlDatabase('test', user='postgres')

创建完毕可以通过PyCharm自带的Database查看数据库,也可以使用其它软件查看

  1. 本想通过DBeaver打开db文件(包括连接MySQL数据库),方便后续操作,尝试半天发现可以连接但是怎么都无法显示,不知道是否与版本问题有关(这里尝试的是21.0.3版本),后来使用了JetBrains DataGrip(据说很好用),成功打开db文件(也可以使用SQLite Studio)

Peewee操作数据库

列举常用操作,即增删改查,其它操作后续慢慢补充

新增

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

 类似资料: