Python使用Peewee创建数据库的实现示例
作者:盛夏光年ltk
Peewee简介
Peewee是一个简单小巧的Python ORM(对象关系映射 Object Relational Mapping,简称ORM),支持SQLite、MySQL、PostgreSQL等数据库,本文主讲前两者。
创建MySQL数据库
- 去官网下载MySQL并启动mysql服务;
- 打开MySQL Workbench配置好数据库,如密码等;
- 在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)
- 再打开MySQL Workbench就可以看到刚刚创建的Test数据库和Test表;
创建SQLite数据库
- SQLite数据库可以直接由Peewee创建,与上db_model.py类似,修改创建语句即可;
# 数据库文件路径 db_path = "../database/test.db" db = SqliteDatabase(db_path) # PostgreSQL数据库则调用PostgresqlDatabase方法即可 # db = PostgresqlDatabase('test', user='postgres')
创建完毕可以通过PyCharm自带的Database查看数据库,也可以使用其它软件查看
- 本想通过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 指定索引类型,不常用,一般默认即可。
到此这篇关于Python使用Peewee创建数据库的实现示例的文章就介绍到这了,更多相关Python Peewee创建数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!