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 相关文章推荐
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
May 17 Python
python3+PyQt5实现文档打印功能
Apr 24 Python
pandas 读取各种格式文件的方法
Jun 22 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
Django 内置权限扩展案例详解
Mar 04 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
python返回数组的索引实例
Nov 28 Python
Python中logging日志库实例详解
Feb 19 Python
理解深度学习之深度学习简介
Apr 14 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
Sep 25 Python
ubuntu安装jupyter并设置远程访问的实现
Mar 31 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后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
深入PHP5中的魔术方法详解
2013/06/17 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
JavaScript入门学习书籍推荐
2008/06/12 Javascript
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
js使用心得分享
2015/01/13 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
Node.js系列之发起get/post请求(2)
2019/08/30 Javascript
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
Python实现简单状态框架的方法
2015/03/19 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
python查询mysql,返回json的实例
2018/03/26 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
2020/02/29 Python
python使用smtplib模块发送邮件
2020/12/17 Python
迪奥官网:Dior.com
2018/12/04 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
高三自我鉴定
2013/10/23 职场文书
女大学生自我鉴定
2013/12/09 职场文书
财务科长个人对照检查材料
2014/09/18 职场文书
运动会宣传稿50字
2015/07/23 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书