Python使用Peewee创建数据库的实现示例

 更新时间:2023年08月29日 14:34:23   作者:盛夏光年ltk  
Peewee是一个简单小巧的Python ORM,本文主要介绍了Python使用Peewee创建数据库的实现示例,具有一定的参考价值,感兴趣的可以了解一下

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创建数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文搞懂Python List和Tuple的区别

    一文搞懂Python List和Tuple的区别

    list和tuple都是可迭代对象中的容器序列,能够存放不同类型的数据,并且存的是它们所包含的任意类型的对象的引用,这算是两者之间的一个相同点,本文详细给大家介绍了Python List和Tuple的区别,需要的朋友可以参考下
    2025-05-05
  • 详解Python遍历文件和文件路径拼接

    详解Python遍历文件和文件路径拼接

    这篇文章主要为大家详细介绍了Python遍历文件和文件路径拼接的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • Pyqt5将多个类组合在一个界面显示的完整示例

    Pyqt5将多个类组合在一个界面显示的完整示例

    这篇文章主要给大家介绍了关于Pyqt5将多个类组合在一个界面显示的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09
  • 浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)

    浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)

    下面小编就为大家分享一篇浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • python使用pdfplumber库一键提取pdf中的所有超链接

    python使用pdfplumber库一键提取pdf中的所有超链接

    超链接在 pdf 中被归类为“链接注释”(Link Annotations),本文将详细介绍Python如何基于pdfplumber库提取PDF中超链接,希望对大家有所帮助
    2026-04-04
  • django创建简单的页面响应实例教程

    django创建简单的页面响应实例教程

    这篇文章主要给大家介绍了关于django如何创建简单的页面响应的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用django具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • 使用python实现正则匹配检索远端FTP目录下的文件

    使用python实现正则匹配检索远端FTP目录下的文件

    这篇文章主要介绍了使用python实现正则匹配检索远端FTP目录下的文件的方法,非常的简单实用,需要的小伙伴参考下
    2015-03-03
  • Jupyter安装链接aconda实现过程图解

    Jupyter安装链接aconda实现过程图解

    这篇文章主要介绍了Jupyter安装链接aconda实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Python实现定时精度可调节的定时器

    Python实现定时精度可调节的定时器

    这篇文章主要为大家详细介绍了Python实现定时精度可调节的定时器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Python文件解析之Excel/Word/PDF的解析、处理、预览与下载

    Python文件解析之Excel/Word/PDF的解析、处理、预览与下载

    本文详细介绍了如何实现一个文件上传、解析、预览、编辑和下载的系统,支持Excel、Word和PDF格式,系统使用了Python和前端技术,通过插件化设计,灵活支持不同的文件格式处理,每个文件类型都有详细的解析、处理、预览和编辑流程,以及相应的API接口,需要的朋友可以参考下
    2026-02-02

最新评论