Python轻量级ORM框架Peewee访问sqlite数据库的方法详解


Posted in Python onJuly 20, 2017

本文实例讲述了Python轻量级ORM框架Peewee访问sqlite数据库的方法。分享给大家供大家参考,具体如下:

ORM框架就是 object relation model,对象关系模型,用来实现把数据库中的表 映射到 面向对象编程语言中的类,不需要写sql,通过操作对象就能实现 增删改查。

ORM的基本技术有3种:

(1)映射技术

数据类型映射:就是把数据库中的数据类型,映射到编程语言中的数据类型。比如,把数据库的int类型映射到Python中的integer 类型。
类映射:把数据库中的表,映射到面向对象编程语言的类,这样就不用写sql,直接操作对象就可以了。
关系映射:关系型数据库最大的特点在于实体之间的关系,也就是表之间通过主外键的设置,产生的关联,把这种关联映射成编程语言中基于对象引用的关系连接。

(2)CURD技术

CURD就是增加、更新、检索、删除的意思,就是实现了数据库中的增删改查的功能。

(3)缓存技术

把数据库中查询到的数据,以类对象的形式,存储在内存中,用的时候随时提取。

在ORM查询命令中,并不会去查询数据库,而是当真正要读取数据时,才到数据库中去查数据。

一、安装peewee

c:\Python27\Scripts>pip install peewee
Collecting peewee
 Downloading peewee-2.8.5.tar.gz (506kB)
  100% |????????????????????????????????| 512kB 437kB/s
Installing collected packages: peewee
 Running setup.py install for peewee ... done
Successfully installed peewee-2.8.5

二、定义表到类的映射

先把表定义为类,保存为 orm.py,后面的代码会引用这个模块。

代码如下:

# -*- coding:utf8 -*-
from peewee import *
db = SqliteDatabase('test.db')
class BaseModel(Model):
  class Meta:
    database = db
class Course(BaseModel):
  id = PrimaryKeyField()
  title = CharField(null = False)
  period = IntegerField()
  description = CharField()
  class Meta:
    order_by = ('title',)
    db_table = 'course'
class Teacher(BaseModel):
  id = PrimaryKeyField()
  name = CharField(null = False)
  gender = BooleanField()
  address = CharField()
  course_id = ForeignKeyField(Course,to_field='id',related_name = "course")
  class Meta:
    order_by = ('name',)
    db_table = 'teacher'

三、创建表、新增记录

# -*- coding:utf8 -*-
from orm import *
Course.create_table()
Teacher.create_table()
Course.create(id = 1,title='经济学',period = 320,description='文科必修')
Course.create(id = 2,title='大学语文',period = 300,description='所有学科必修')
Course.create(id = 3,title='操作系统',period = 320,description='计算机必修')
Course.create(id = 4,title='马克思主义哲学',period = 320,description='必修')
Teacher.create(id = 1,name = '张三',gender=True,address='...',course_id = 1)
Teacher.create(id = 2,name = '李四',gender=False,address='-',course_id = 2)
Teacher.create(id = 3,name = '王五',gender=True,address='=',course_id = 3)

四、更复杂的操作

# -*- coding:gbk -*-
from orm import *
#获取1行数据
record = Course.get(Course.title=='大学语文')
print("课程:%s ,学时: %d" %(record.title,record.period))
#更新这行数据的period字段,保存
record.period = 200
record.save()
print("学分改为:%d" % record.period)
#获取1行数据,再删除,如果不存在,则会报错
record = Course.get(Course.title=='马克思主义哲学')
record.delete_instance()
###查询所有数据
course = Course.select()
###查询符合条件的数据,排序
course = Course.select().where(Course.id <3).order_by(Course.period.desc())
###计算平均值
total = Course.select(fn.Avg(Course.period)).alias('avg_period')
###更新数据
Course.update(period=300).where(Course.id>2).execute()
###关联数据
Record = Course.select().join(Teacher).where(Teacher.gender == True)

操作完成后,可以用sqlite3 test.db ,然后用命令查看表数据。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
Jul 18 Python
Django中使用group_by的方法
May 26 Python
python3爬虫之设计签名小程序
Jun 19 Python
Django 实现购物车功能的示例代码
Oct 08 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
May 29 Python
python如何以表格形式打印输出的方法示例
Jun 21 Python
在notepad++中实现直接运行python代码
Dec 18 Python
new_zeros() pytorch版本的转换方式
Feb 18 Python
在python3.64中安装pyinstaller库的方法步骤
Jun 02 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
Python基于Faker假数据构造库
Nov 30 Python
聊聊pytorch测试的时候为何要加上model.eval()
May 23 Python
Python函数式编程
Jul 20 #Python
python 换位密码算法的实例详解
Jul 19 #Python
python实现rsa加密实例详解
Jul 19 #Python
Python中标准库OS的常用方法总结大全
Jul 19 #Python
spyder常用快捷键(分享)
Jul 19 #Python
JPype实现在python中调用JAVA的实例
Jul 19 #Python
简单谈谈Python中的json与pickle
Jul 19 #Python
You might like
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
2019/04/10 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
JS判断日期格式是否合法的简单实例
2016/07/11 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
详解vue 组件
2020/06/11 Javascript
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
Python如何读取MySQL数据库表数据
2017/03/11 Python
机器学习python实战之手写数字识别
2017/11/01 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
大学四年的个人自我评价
2014/01/14 职场文书
军训自我鉴定200字
2014/02/13 职场文书
优秀本科生求职推荐信
2014/02/24 职场文书
2015年人事科工作总结
2015/04/28 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis
Python实现排序方法常见的四种
2021/07/15 Python