Python ORM框架之 Peewee入门
之前在学Django时,发现它的模型层非常好用,把对数据库的操作映射成对类、对象的操作,避免了我们直接写在Web项目中SQL语句,当时想,如果这个模型层可以独立出来使用就好了,那我们平台操作数据库也可以这么玩了,我不喜欢写SQL语句。
后来才知道,原来这个叫ORM(Object Relational Mapping,对象关系映射),在Python下面有很多这样的类库,如SQLObject、Storm、peewee和SQLAlchemy。
这里就给你们介绍一下Peewee的基本使用,因为它非常的轻量级,最主要是和Django的ORM 操作很像,如果你学过Django那么很容易上手。
这篇博客承接上一篇,以操作MySQL为例。前提条件:
- Python3.x 编程语言
- MySQL数据库
- PyMySQL驱动
一、安装peewee
安装非常简单,推荐使用pip命令。
> pip install peewee

另外,你也可以通过下载包安装:https://pypi.python.org/pypi/peewee
二、创建表
from peewee import *
import datetime db = MySQLDatabase("guest", host="127.0.0.1", port=3306, user="root", passwd="")
db.connect() class BaseModel(Model): class Meta:
database = db class User(BaseModel):
username = CharField(unique=True) class Tweet(BaseModel):
user = ForeignKeyField(User, related_name='tweets')
message = TextField()
created_date = DateTimeField(default=datetime.datetime.now)
is_published = BooleanField(default=True) if __name__ == "__main__":
# 创建表
User.create_table() # 创建User表
Tweet.create_table() # 创建Tweet表
这里面包含不了少知识点,我们来一一解释。
首先,导入peewee库下面的所有方法,这个当然需要。
然后,通过MySQLDatabase连接数据库,把数据连接的几个必要参数一一填写。通过connect()方法与MySQL数据库建立链接。
接下来就是表的创建,创建BaseModel类,在该类下创建子类Meta,Meta是一个内部类,它用于定义peewee的Model类的行为特性。指定dabatase 为 前面定义的db。
再接下来就是表的创建了,我们在SQL语句创建表时一般需要知道以下信息。表的名字,表有哪些字段?这些字段分别是什么类型?是否允许为空,或自增?哪个字段是主键是?哪个是外键?
ORM用编程语言里的概念帮我们映射了这些东西。
创建 User 和 Tweet类做为表名。在类下面定义的变量为字段名,如username、message、created_date等。通过CharField、DateTimeField、BooleanField表示字段的类型。ForeignKeyField 建立外键。 主键呢? 建表时不都要有个主键id嘛,不用!peewee默认已经为我们加上这个id了。
最后,执行create_table()方法创建两张表。
通过数据库工具,查看生成的两张表。


三、插入数据
要想操作表数据,首先表里得有数据。先来看看如何添加数据。
if __name__ == "__main__":
# ...
user = User.create(username='tom')
Tweet.create(user=user, message="这是一段文字")
这样就要User表里添加一个tom的用户,这用户发了一条Tweet,在Tweet表里。但这个用户兴致来了,想继续发第二条Tweet。于是:
if __name__ == "__main__":
# ...
Tweet.create(user_id=1, message="这是第二段文字")
咦~!?不对,我们没有创建user_id字段啊!但是,如果你查询Tweet表,就会发现有这个字段,用它来关联User表的id。

四、查询数据
接下来,查询数据。
if __name__ == "__main__":
# ...
# 查询 1
t = Tweet.get(message="这是一段文字")
print(t.user_id)
print(t.created_date)
print(t.is_published)
查询结果:
1
2017-05-19 15:44:32
True
不过,get()方法只能查询一条,且是唯一的一条数据;通过查询条件不能查询出多条,也不能查询出0条。
if __name__ == "__main__":
# ...
# 查询 2
ts = Tweet.filter(user_id=1)
for t in ts:
print(t.message)
运行结果:
这是一段文字
这是第二段文字
而,filter()方法,就会更加灵活,可以查询多条结果,并把结果循环输出。
五、Playhouse库
Playhouse库中提供了一些比较有意思的方法。当我们在安装peewee时,也会捎带着把它装上。
这里只介绍它里面的model_to_dict和dict_to_model两个方法。
model_to_dict方法用法:
from playhouse.shortcuts import model_to_dict, dict_to_model # …… if __name__ == "__main__":
# ……
user = User.create(username='jack')
# 把数据对象转成字典
u = model_to_dict(user)
print(u)
运行结果:
{'id': 7, 'username': 'jack'}
dict_to_model方法用法:
from playhouse.shortcuts import model_to_dict, dict_to_model # …… if __name__ == "__main__":
# ……
# 把字典转成数据对象
user_data = {'id': 2, 'username': 'charlie'}
user = dict_to_model(User, user_data)
print(user.username)
运行结果:
charlie
Python ORM框架之 Peewee入门的更多相关文章
- Nodejs ORM框架Sequelize快速入门
Nodejs ORM框架Sequelize快速入门 什么是ORM? 简单的讲就是对SQL查询语句的封装,让我们可以用OOP的方式操作数据库,优雅的生成安全.可维护的SQL代码.直观上,是一种Model ...
- Python ORM框架之SQLAlchemy
前言: Django的ORM虽然强大,但是毕竟局限在Django,而SQLAlchemy是Python中的ORM框架: SQLAlchemy的作用是:类/对象--->SQL语句--->通过 ...
- python ORM框架:SqlAlchemy
ORM,对象关系映射,即Object Relational Mapping的简称,通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系,这样做的目的:简化sql语言操作数据库的繁琐过程( ...
- python 三大框架之一Django入门
Django 是从真实世界的应用中成长起来的,它是由 堪萨斯(Kansas)州 Lawrence 城中的一个 网络开发小组编写的. 它诞生于 2003 年秋天,那时 Lawrence Journal- ...
- python orm框架
#!/usr/bin/python# -*- coding: utf-8 -*-from sqlalchemy import create_enginefrom sqlalchemy import T ...
- python 三大框架之一Flask入门
Flask轻量级框架,Flask是python中的轻量级框架. 打开终端 输入pip install Flask 命令 下载以及安装Flask框架 检查是否下载成功及能否使用 首先导入python环境 ...
- Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 ...
- python orm框架-----SQLALchemy-查询篇
似乎ORM最难设计的部分是查询.特别是面向对象的查询,今天学习SQLAlchemy,发现SQLAlchemy的查询语法竟如此灵活,惊叹其如此强大的表达能力的同时也对Python也有了更深的认识.下面看 ...
- Python>>>Flask框架使用之入门
操作平台Windows Python2.7 安装 pip install flask Hello World程序 from flask import Flask app = Flask(__name_ ...
随机推荐
- zabbix 监控 tomcat jmx
zabbix_server: zabbix_server.conf : # Add JavaGateway=127.0.0.1 JavaGatewayPort=10052 StartJavaPolle ...
- ajax VS websocket
一. ajax VS websocket总结 http://blog.csdn.net/qiuhuanmin/article/details/50719114 二.用Websocket代替Ajax来开 ...
- SpringMVC 自定义全局日期转换器
第一步: 编写自定义转换器的类 /* * 自定义日期转换器 */ public class CustomDateConverter implements Converter<String, Da ...
- Angular2入门-数据绑定
▓▓▓▓▓▓ 大致介绍 Angular2中数据绑定的方式默认是以单向方式,数据绑定的方式可以分为: 1.属性绑定和插值表达式 组件类-> 模板 2.事件绑定:模板 -> 组件类 3.双向绑 ...
- Android -- Annotation(注解)原理详解及常见框架应用
1,我们在上一篇讲到了EventBus源码及3.0版本的简单使用,知道了我们3.0版本是使用注解方式标记事件响应方法的,这里我们就有一个疑问了,为什么在一个方法加上类似于"@Subscrib ...
- Virtualbox 复制 CentOS 虚拟机无法联网
Centos刚装好后无法联网 复制虚拟机后,出现 No such device eth0 我们要处理的三个问题: 在Virtualbox上安装好Centos后如何联网 如何在Virtualbox上复制 ...
- 使用Dubbox构架分布式服务
第一部分:Dubbo的背景分析及工作原理 1. Dubbo是什么?Dubbo是一个来自阿里巴巴的开源分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 简单的说 ...
- 在Oracle中添加用户登录名称
第一步,打开Oracle客户端单击 “帮助”-->"支持信息"-->”TNS名“,加入红色部分.页面如下: 第二步,再次打开Oracle客户端时,就会显示数据库了,只需 ...
- D3D中一些接口的变化和VS配置关联的方法
一.一些改变 #include <xnamath.h> 改为了 #include <DirectXMath.h> 二.vs关联 步骤: 1.选择工程的Properties, 2 ...
- 主机ping通虚拟机,虚拟机ping通主机解决方法(NAT模式)
有时候需要用虚拟机和宿主机模拟做数据交互,ping不通是件很烦人的事,本文以net模式解决这一问题. 宿主机系统:window7 虚拟机系统:CentOs7 连接方式:NAT模式 主机ping通虚拟机 ...