背景

在web开发的时候,一些比较简单的小型系统其实也得ORM框架,显而易见其实开发速度上是提升很多,因为有必要学习一下对应的ORM库。

关于ORM一些说明

关于ORM(Object Relational Mapping,对象关系映射)在python中其实存在几个,主要有的还有SQLAlchemy,不过其实今天咋们的猪脚peewee的内核其实也是基于SQLAlchemy,所以可能应该是更加高效!因为还没做进行具体的测试和数据对比,所以现在还是猜测!

后期我也会继续实践一下关于SQLAlchemy在bottle中的使用!

理论上相关ORM应该具备的能力有:

(1)对象关系映射(数据类型映射,类映射,关系映射)

(2)CURD操作

(3)缓存优化

ORM一些优点:

(1)屏蔽数据库操作细节,开发者不需要通过SQL进行和数据库进行交互,提高开发效率

(2)便捷数据库迁移

(3)缓存技术提高数据库操作效率。

安装

pip install peewee

image.png

示例

因为我这边的环境数据库使用的还是Postgresql,所以示例我就以Postgresql为主:

先通过navicat在本地新建一个测试数据库叫做:test_peewee

image.png

新建一个py文件(LearnPeewee.py):

image.png

#!/usr/bin/evn python

# coding=utf-8

# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +

# ┏┓   ┏┓+ +

#    ┏┛┻━━━┛┻┓ + +

#    ┃       ┃

#    ┃   ━   ┃ ++ + + +

#    ████━████ ┃+

#    ┃       ┃ +

#    ┃   ┻   ┃

#    ┃       ┃ + +

#    ┗━┓   ┏━┛

#      ┃   ┃

#      ┃   ┃ + + + +

#      ┃   ┃    Codes are far away from bugs with the animal protecting

#      ┃   ┃ +     神兽保佑,代码无bug

#      ┃   ┃

#      ┃   ┃  +

#      ┃    ┗━━━┓ + +

#      ┃        ┣┓

#      ┃        ┏┛

#      ┗┓┓┏━┳┓┏┛ + + + +

#       ┃┫┫ ┃┫┫

#       ┗┻┛ ┗┻┛+ + + +

# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +"""

"""

Author = zyx

@Create_Time: 2018/3/21 23:11

@version: v1.0.0

@Contact: 308711822@qq.com

@File: LearnPeewee.py

@文件功能描述:

"""

from peewee import *

# 建立一个PostgresqlDatabase数据库引擎对象,连接到本地的数据库

db = PostgresqlDatabase("test_peewee", host="localhost", port=5432, user="postgres", passwd="123456")

db.connect()

# 定义一个ORM基类,在基类中指定本ORM所使用的数据库

class BaseModel(Model):

class Meta:

database = db

# 定义一个Course表(课程表)。继承于BaseModel

class Course(BaseModel):

id = PrimaryKeyField() # 课程唯一标识

title = CharField(null=False) # 课程名称

period = IntegerField() # 学时

des = CharField() # 课程描述

class Meta:

order_by = {'title', }

db_table = 'course' # 定义数据库中表的名称

# 定义一个Teacher表(老师表)。继承于BaseModel

class Teacher(BaseModel):

id = PrimaryKeyField() # 唯一标识

name = CharField(null=False) # 名称

gender = BooleanField() # 性别

address = CharField() # address地址

course_id = ForeignKeyField(Course, to_field='id', related_name='course')

class Meta:

order_by = {'name', }

db_table = 'teacher' # 定义数据库中表的名称

# 执行建表,只需要执行一次

Course.create_table()

Teacher.create_table()

执行报错:

image.png

原因是:

连接字段参数错误

passwd--->password

# 建立一个PostgresqlDatabase数据库引擎对象,连接到本地的数据库

db = PostgresqlDatabase("test_peewee", host="localhost", port=5432, user="postgres", password="123456")

db.connect()

执行成功后查看一下对应的数据库表的情况:

image.png

代码:

#!/usr/bin/evn python

# coding=utf-8

# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +

# ┏┓   ┏┓+ +

#    ┏┛┻━━━┛┻┓ + +

#    ┃       ┃

#    ┃   ━   ┃ ++ + + +

#    ████━████ ┃+

#    ┃       ┃ +

#    ┃   ┻   ┃

#    ┃       ┃ + +

#    ┗━┓   ┏━┛

#      ┃   ┃

#      ┃   ┃ + + + +

#      ┃   ┃    Codes are far away from bugs with the animal protecting

#      ┃   ┃ +     神兽保佑,代码无bug

#      ┃   ┃

#      ┃   ┃  +

#      ┃    ┗━━━┓ + +

#      ┃        ┣┓

#      ┃        ┏┛

#      ┗┓┓┏━┳┓┏┛ + + + +

#       ┃┫┫ ┃┫┫

#       ┗┻┛ ┗┻┛+ + + +

# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +"""

"""

Author = zyx

@Create_Time: 2018/3/21 23:11

@version: v1.0.0

@Contact: 308711822@qq.com

@File: LearnPeewee.py

@文件功能描述:

"""

from peewee import *

from playhouse.shortcuts import model_to_dict, dict_to_model

# from playhouse.pool import PooledPostgresqlExtDatabase

#

# db = PooledPostgresqlExtDatabase(

# 'my_database',

# max_connections=8,

# stale_timeout=300,

# user='postgres')

#

# class BaseModel(Model):

# class Meta:

# database = db

# 建立一个PostgresqlDatabase数据库引擎对象,连接到本地的数据库

db = PostgresqlDatabase("test_peewee", host="localhost", port=5432, user="postgres", password="123456")

db.connect()

# 定义一个ORM基类,在基类中指定本ORM所使用的数据库

class BaseModel(Model):

class Meta:

database = db

# 定义一个Course表(课程表)。继承于BaseModel

class Course(BaseModel):

id = PrimaryKeyField() # 课程唯一标识

title = CharField(null=False) # 课程名称

period = IntegerField() # 学时

des = CharField() # 课程描述

class Meta:

order_by = {'title', }

table_name = 'course' # 定义数据库中表的名称

# 定义一个Teacher表(老师表)。继承于BaseModel

class Teacher(BaseModel):

id = PrimaryKeyField() # 唯一标识

name = CharField(null=False) # 名称

gender = BooleanField() # 性别

address = CharField() # address地址

course_id = ForeignKeyField(Course, to_field='id', related_name='course')

class Meta:

order_by = {'name', }

table_name = 'teacher' # 定义数据库中表的名称

# 执行建表,只需要执行一次

Teacher.drop_table()

Course.drop_table()

# peewee.IntegrityError: 错误: 在 "course" 上的更新或删除操作违反了在 "teacher" 上的外键约束 "teacher_course_id_fkey"

# DETAIL: 键值对(id)=(2)仍然是从表"teacher"引用的.

# 执行建表,只需要执行一次

# Teacher.delete()

Course.create_table()

Teacher.create_table()

# 新增行

obj1 = Course.create(id=1, title='经济学', period=320, des='文理科学生均可选修')

# 把数据对象转成字典

u = model_to_dict(obj1)

print(u)

print('通过create()方法添加数据,它会返回一个模型实例:--->', u)

# 把字典转成数据对象

user_data = {'id': 2, 'username': 'charlie'}

obj1 = dict_to_model(Course, u)

print('把字典转成数据对象:---->', obj1.title)

Course.create(id=2, title='大学英语', period=300, des='大一学生必修课')

Course.create(id=3, title='哲学', period=100, des='必修课')

Course.create(id=104, title='编译原理', period=100, des='计算机系选修')

Teacher.create(name='白阵君', gender=True, address='.1.', course_id=1)

Teacher.create(name='李森', gender=True, address='.2.', course_id=3)

Teacher.create(name='张雯雯', gender=False, address='.3.', course_id=2)

Teacher.create(name='李森222', gender=True, address='.344.', course_id=3)

# 查询一行

record = Course.get(Course.title == '大学英语')

print("课程:%s, 学时:%d" % (record.title, record.period))

# 更新

record.period = 200

record.save()

print('更新')

# 删除

# 查询一行

record = Course.get(Course.title == '大学英语')

print("更新之后---课程:%s, 学时:%d" % (record.title, record.period))

# peewee.IntegrityError: 错误: 在 "course" 上的更新或删除操作违反了在 "teacher" 上的外键约束 "teacher_course_id_fkey"

# DETAIL: 键值对(id)=(2)仍然是从表"teacher"引用的.

# 这里想要删除一门课程,但是这门课程可能有一个老师在占用已解决安排上课了!!想要直接删除课程的话,需要先把占用这门课程的老师给删除

# get()方法只能查询一条,且是唯一的一条数据

teacher_record = Teacher.get(Teacher.course_id == record.id)

print('老师的记录', teacher_record.name)

teacher_record.delete_instance()

print('老师被删除记录')

print('删除课程成功!!!')

print('查询老师!')

# teacher_record = Teacher.get(Teacher.course_id ==record.id)

# for i in teacher_record:

# print(i.name, i.address)

# 查询所有记录

courses = Course.select()

for i in courses:

print(i.id, i.title, i.period, i.des)

# 带条件查询,并将结果按period字段倒序排序

courses = Course.select().where(Course.id < 10).order_by(Course.period.desc())

for i in courses:

print(i.id, i.title, i.period, i.des)

# 统计所有课程的平均学时

total = Course.select(fn.Avg(Course.period).alias('avg_period'))

for i in total:

print(u"平均学时:", i.avg_period)

# 更新多个记录

Course.update(period=300).where(Course.id > 100).execute()

# 多表连接操作,Peewee会自动根据ForeignKeyField的外键定义进行连接:

Record = Course.select().join(Teacher).where(Teacher.gender == True)

for i in Record:

print(i.id, i.title, i.period, i.des)

db.close()

python开发小型数据库_python web开发之数据库ORM的 peewee库 动手学习实践笔记相关推荐

  1. python web 开发教程下载_Python Web开发从入门到精通

    Python Web开发从入门到精通循序渐进地讲解了Python Web开发的核心知识,并通过具体实例的实现过程演示了Web开发程序的流程.Python Web开发从入门到精通共15章,内容包括Pyt ...

  2. python 模板引擎 对比_Python Web开发模板引擎优缺点总结

    做 Web 开发少不了要与模板引擎打交道.我陆续也接触了 Python 的不少模板引擎,感觉可以总结一下了. 一.首先按照我的熟悉程度列一下: pyTenjin:我在开发 Doodle 和 91 外教 ...

  3. 10年后端开发程序员详解数据库缓存方案到底有多少名堂。丨Linux服务器开发丨后端开发丨中间件丨web服务器丨数据库缓存

    数据库缓存方案到底有多少花样,一节课带你缕清 1. 读写分离方案 2. 若干个缓存解决方案 3. 缓存故障如何解决 视频讲解如下,点击观看: 10年后端开发程序员详解数据库缓存方案到底有多少名堂.丨L ...

  4. chatgpt赋能python:Python是一门非常流行的编程语言,它被广泛应用于不同领域的软件开发中,包括Web开发、数据科学、人工智能等。虽然Python本身非常强大和灵活,但是要让自己的Pyt

    Python是一门非常流行的编程语言,它被广泛应用于不同领域的软件开发中,包括Web开发.数据科学.人工智能等.虽然Python本身非常强大和灵活,但是要让自己的Python代码在互联网上被搜索引擎优 ...

  5. 《msdn开发精选》“高性能Web开发技术”网上聊天活动

    <msdn开发精选>"高性能Web开发技术"网上聊天活动 本期嘉宾:郭红俊(ghj1976),孟宪会(孟子E章) ,刘如鸿(策划编辑) 聊天主题:高性能的Web应用程序 ...

  6. python web项目案例教程_Python Web开发案例教程(慕课版)——使用Flask、Tornado、Django...

    第1章 Web开发基础1 1.1 Web概述 2 1.1.1 什么是Web 2 1.1.2 Web应用程序的工作原理 2 1.1.3 Web的发展历程 2 1.2 Web前端开发基础 4 1.2.1 ...

  7. python web开发第三方库_Python Web开发中常用的第三方库

    Python Web开发中常用的第三方库 TL;DR 经常有朋友问,如果用Python来做Web开发,该选用什么框架?用 Pyramid 开发Web该选用怎样的组合等问题?在这里我将介绍一些Pytho ...

  8. python编程软件排行榜_Python编程开发工具:这10个对Web开发者最有用的Python包

    Python编程一时间成为了开发人员最喜欢的语言之一.无论是专业的,业余的,还是作为一个Python初学者,都可以从Python编程语言及其程序包中受益.Python已经被证明是当今最具活力的面向对象 ...

  9. python web开发要学什么_Python WEB开发 用Python开展web开发必须学习什么?

    用Python开展web开发必须学习哪些? 针对新手想更轻轻松松的学好Python开发技术性,Python网络爬虫,Python数据分析,人工智能技术等技术性,这儿给大伙儿共享一套系统软件教育资源,加 ...

最新文章

  1. 数据密集型应用系统设计 [Designing Data-Intensive Applications]
  2. 子组件获取父组件的值,将这个值作为状态值保存
  3. JAVA面试题(part3)--if条件语句
  4. 问题:循环元素,被选中元素个数,全选
  5. xml学习4-dtd
  6. 吴恩达机器学习笔记四之正则化
  7. 虚拟化五、KVM虚拟化技术2
  8. 基于C4.5神经网络集成
  9. java-家庭作业2
  10. 导弹防御系统java_导弹防御问题 动态规划 java
  11. css module模组化
  12. ftp工具FileZilla下载安装配置
  13. 机器学习服务文本识别能力演进,大幅提升识别准确率
  14. 穿山甲插屏广告居中_自渲染插屏
  15. Java基础:IO 流中的 flush
  16. 09 模型的增删查改《ThinkPHP6 入门到电商实战》
  17. 国际最顶尖的AI技术发展,愈像一场比拼资金与人才的竞赛
  18. DS1307时钟模块
  19. 汇编语言数据传送指令之通用数据传送类指令
  20. 阿里达摩院火速挖人!微软、谷歌著名AI专家入职阿里人工智能实验室

热门文章

  1. matlab在电力系统故障的应用,MATLAB在电力系统故障分析中的应用
  2. sqliteman install parameter
  3. HDU 3861 The King’s Problem (强连通缩点+DAG最小路径覆盖)
  4. thinkPHP 数据库操作和分页类
  5. HackRF 无线门铃信号录制与重放
  6. Magento 架构原则
  7. abctod_123456
  8. 通过gdb调试分析Linux内核的启动过程
  9. 【网络】c++ socket 学习笔记(一)
  10. ws2_32.dll的妙用与删除 (禁网)