Pony是Python的一种ORM,它允许使用生成器表达式来构造查询,通过将生成器表达式的抽象语法树解析成SQL语句。它也有在线ER图编辑器可以帮助你创建Model。

示例分析

Pony语句:

select(p for p in Person if p.age > 20)

翻译成sql语句就是:

SELECT p.id, p.name, p.age, p.classtype, p.mentor, p.gpa, p.degree

FROM person p

WHERE p.classtype IN ('Student', 'Professor', 'Person')

AND p.age > 20

Pony语句:

select(c for c in Customer

if sum(c.orders.price) > 1000)

翻译成sql语句就是:

SELECT "c"."id"

FROM "Customer" "c"

LEFT JOIN "Order" "order-1"

ON "c"."id" = "order-1"."customer"

GROUP BY "c"."id"

HAVING coalesce(SUM("order-1"."total_price"), 0) > 1000

安装Pony

pip install pony

使用Pony

#!/usr/bin/env python

#-*- coding:utf-8 -*-

import datetime

import pony.orm as pny

import sqlite3

# conn = sqlite3.connect('D:\日常python学习PY2\Pony学习\music.sqlite')

# print conn

# database = pny.Database()

# database.bind("sqlite","music.sqlite",create_db=True)

# 路径建议写绝对路径。我这边开始写相对路径报错 unable to open database file

database = pny.Database("sqlite","D:\日常python学习PY2\Pony学习\music.sqlite",create_db=True)

########################################################################

class Artist(database.Entity):

"""

Pony ORM model of the Artist table

"""

name = pny.Required(unicode)

#被外键关联

albums = pny.Set("Album")

########################################################################

class Album(database.Entity):

"""

Pony ORM model of album table

"""

#外键字段artlist,外键关联表Artist,Artist表必须写Set表示被外键关联

#这个外键字段默认就是index=True,除非自己指定index=False才不会创建索引,索引名默认为[idx_表名__字段](artist)

artist = pny.Required(Artist)

title = pny.Required(unicode)

release_date = pny.Required(datetime.date)

publisher = pny.Required(unicode)

media_type = pny.Required(unicode)

# turn on debug mode

pny.sql_debug(True) # 显示debug信息(sql语句)

# map the models to the database

# and create the tables, if they don't exist

database.generate_mapping(create_tables=True) # 如果数据库表没有创建表

运行之后生成sqlite如下:

上述代码对应的sqlite语句是:

GET CONNECTION FROM THE LOCAL POOL

PRAGMA foreign_keys = false

BEGIN IMMEDIATE TRANSACTION

CREATE TABLE "Artist" (

"id" INTEGER PRIMARY KEY AUTOINCREMENT,

"name" TEXT NOT NULL

)

CREATE TABLE "Album" (

"id" INTEGER PRIMARY KEY AUTOINCREMENT,

"artist" INTEGER NOT NULL REFERENCES "Artist" ("id"),

"title" TEXT NOT NULL,

"release_date" DATE NOT NULL,

"publisher" TEXT NOT NULL,

"media_type" TEXT NOT NULL

)

CREATE INDEX "idx_album__artist" ON "Album" ("artist")

SELECT "Album"."id", "Album"."artist", "Album"."title", "Album"."release_date", "Album"."publisher", "Album"."media_type"

FROM "Album" "Album"

WHERE 0 = 1

SELECT "Artist"."id", "Artist"."name"

FROM "Artist" "Artist"

WHERE 0 = 1

COMMIT

PRAGMA foreign_keys = true

CLOSE CONNECTION

插入/增加数据

#!/usr/bin/env python

#-*- coding:utf-8 -*-

import datetime

import pony.orm as pny

from models import Album, Artist

from database import PonyDatabase

# ----------------------------------------------------------------------

@pny.db_session

def add_data():

""""""

new_artist = Artist(name=u"Newsboys")

bands = [u"MXPX", u"Kutless", u"Thousand Foot Krutch"]

for band in bands:

artist = Artist(name=band)

album = Album(artist=new_artist,

title=u"Read All About It",

release_date=datetime.date(1988, 12, 01),

publisher=u"Refuge",

media_type=u"CD")

albums = [{"artist": new_artist,

"title": "Hell is for Wimps",

"release_date": datetime.date(1990, 07, 31),

"publisher": "Sparrow",

"media_type": "CD"

},

{"artist": new_artist,

"title": "Love Liberty Disco",

"release_date": datetime.date(1999, 11, 16),

"publisher": "Sparrow",

"media_type": "CD"

},

{"artist": new_artist,

"title": "Thrive",

"release_date": datetime.date(2002, 03, 26),

"publisher": "Sparrow",

"media_type": "CD"}

]

for album in albums:

a = Album(**album)

if __name__ == "__main__":

db = PonyDatabase()

db.bind("sqlite", "D:\日常python学习PY2\Pony学习\music.sqlite", create_db=True)

db.generate_mapping(create_tables=True)

add_data()

# use db_session as a context manager

with pny.db_session:

a = Artist(name="Skillet")

'''

您会注意到我们需要使用一个装饰器db_session来处理数据库。

它负责打开连接,提交数据并关闭连接。 你也可以把它作为一个上

下文管理器,with pny.db_session

'''

更新数据

#!/usr/bin/env python

#-*- coding:utf-8 -*-

import pony.orm as pny

from models import Artist, Album

from database import PonyDatabase

db = PonyDatabase()

db.bind("sqlite", "D:\日常python学习PY2\Pony学习\music.sqlite", create_db=True)

db.generate_mapping(create_tables=True)

with pny.db_session:

band = Artist.get(name="Newsboys")

print band.name

for record in band.albums:

print record.title

# update a record

band_name = Artist.get(name="Kutless")

band_name.name = "Beach Boys"

#使用生成器形式查询

'''

result = pny.select(i.name for i in Artist)

result.show()

结果:

i.name

--------------------

Newsboys

MXPX

Beach Boys

Thousand Foot Krutch

Skillet

'''

删除记录

import pony.orm as pny

from models import Artist

with pny.db_session:

band = Artist.get(name="MXPX")

band.delete()

Pony补充

可以连接的数据库:

##postgres

db.bind('postgres', user='', password='', host='', database='')

##sqlite create_db:如果数据库不存在创建数据库文件

db.bind('sqlite', 'filename', create_db=True)

##mysql

db.bind('mysql', host='', user='', passwd='', db='')

##Oracle

db.bind('oracle', 'user/password@dsn')

Entity(实体)类似mvc里面的model

在创建实体实例之前,需要将实体映射到数据库表,生成映射后,可以通过实体查询数据库并创建新的实例。db.Entity自己定义新的实体必须从db.Entity继承

属性

class Customer(db.Entity):

name = Required(str)

picture = Optional(buffer)

sql_debug(True) # 显示debug信息(sql语句)

db.generate_mapping(create_tables=True) # 如果数据库表没有创建表

属性类型

Required

Optional

PrimaryKey

Set

Required and Optional

通常实体属性分为Required(必选)和Optional(可选)

PrimaryKey(主键)

默认每个实体都有一个主键,默认添加了id=PrimaryKey(int,auto=True)属性

class Product(db.Entity):

name = Required(str, unique=True)

price = Required(Decimal)

description = Optional(str)

#等价于下面

class Product(db.Entity):

id = PrimaryKey(int, auto=True)

name = Required(str, unique=True)

price = Required(Decimal)

description = Optional(str)

Set

定义了一对一,一对多,多对多等数据结构

# 一对一

class User(db.Entity):

name = Required(str)

cart = Optional("Cart") #必须Optional-Required or Optional-Optional

class Cart(db.Entity):

user = Required("User")

# 多对多

class Student(db.Entity):

name = pny.Required(str)

courses = pny.Set("Course")

class Course(db.Entity):

name = pny.Required(str)

semester = pny.Required(int)

students = pny.Set(Student)

pny.PrimaryKey(name, semester) #联合主键

pny.sql_debug(True) # 显示debug信息(sql语句)

db.generate_mapping(create_tables=True) # 如果数据库表没有创建表

#-------------------------------------------------------

#一对多

class Artist(database.Entity):

"""

Pony ORM model of the Artist table

"""

name = pny.Required(unicode)

#被外键关联

albums = pny.Set("Album")

class Album(database.Entity):

"""

Pony ORM model of album table

"""

#外键字段artlist,外键关联表Artist,Artist表必须写Set表示被外键关联

#这个外键字段默认就是index=True,除非自己指定index=False才不会创建索引,索引名默认为[idx_表名__字段](artist)

artist = pny.Required(Artist) #外键字段(数据库显示artist)

title = pny.Required(unicode)

release_date = pny.Required(datetime.date)

publisher = pny.Required(unicode)

media_type = pny.Required(unicode)

# Compositeindexes(复合索引)

class Example1(db.Entity):

a = Required(str)

b = Optional(int)

composite_index(a, b)

#也可以使用字符串composite_index(a, 'b')

属性数据类型

格式为 :

属性名 = 属性类型(数据类型)

str

unicode

int

float

Decimal

datetime

date

time

timedelta

bool

buffer ---used for binary data in Python 2 and 3

bytes ---used for binary data in Python 3

LongStr ---used for large strings

LongUnicode ---used for large strings

UUID

attr1 = Required(str)

# 等价

attr2 = Required(unicode)

attr3 = Required(LongStr)

# 等价

attr4 = Required(LongUnicode)

attr1 = Required(buffer) # Python 2 and 3

attr2 = Required(bytes) # Python 3 only

#字符串长度,不写默认为255

name = Required(str,40) #VARCHAR(40)

#整数的大小,默认2bit

attr1 = Required(int, size=8) # 8 bit - TINYINT in MySQL

attr2 = Required(int, size=16) # 16 bit - SMALLINT in MySQL

attr3 = Required(int, size=24) # 24 bit - MEDIUMINT in MySQL

attr4 = Required(int, size=32) # 32 bit - INTEGER in MySQL

attr5 = Required(int, size=64) # 64 bit - BIGINT in MySQL

#无符号整型

attr1 = Required(int, size=8, unsigned=True) # TINYINT UNSIGNED in MySQL

# 小数和精度

price = Required(Decimal, 10, 2) #DECIMAL(10,2)

# 时间

dt = Required(datetime,6)

# 其它参数

unique 是否唯一

auto 是否自增

default 默认值

sql_default

created_at = Required(datetime, sql_default='CURRENT_TIMESTAMP')

index 创建索引

index='index_name' 指定索引名称

lazy 延迟加载的属性加载对象

cascade_delete 关联删除对象

column 映射到数据库的列名

columns Set(多对多列名)

table 多对多中间表的表名字

nullable 允许该列为空

py_check 可以指定一个函数,检查数据是否合法和修改数据

class Student(db.Entity):

name = Required(str)

gpa = Required(float, py_check=lambda val: val >= 0 and val <= 5)

实例操作

# 获取实例

p = Person.get(name="Person") #返回单个实例,如同

Django ORM的get

#------------------------------

# 查询

persons = Person.select()

'''

select并没有连接数据库查询,只是返回一个Query object,调用persons[:]返回所有Person实例

'''

# limit

persons [1:5]

# show

persons.show()

# 生成器表达式查询,然后解析AST树的方式构造SQL语句

select(p for p in Person)

#和Person.select()一样返回Query object

select((p.id, p.name) for p in Person)[:]

# 带where条件查询

select((p.id, p.name) for p in Person if p.age ==20)[:]

# 分组聚合查询

select((max(p.age)) for p in Person)[:] #[25]

max(p.age for p in Person) #25

select(p.age for p in Person).max() #25

#-----------------------------

# 修改实例

@db_session

def update_persons():

p = Person.get(id=2)

p.page = 1000

commit()

# 删除

@db_session

def delete_persons():

p = Person.get(id=2)

p.delete()

commit()

pony使用还可以使用游标操作(这样就可以写原生sql语句了)

result = db.execute('''select name from Artist''')

print result.fetchall()

类似Django ORM的save函数

before_insert()

Is called only for newly created objects before it is inserted into the database.

before_update()

Is called for entity instances before updating the instance in the database.

before_delete()

Is called before deletion the entity instance in the database.

after_insert()

Is called after the row is inserted into the database.

after_update()

Is called after the instance updated in the database.

after_delete()

Is called after the entity instance is deleted in the database.

例如:

class Message(db.Entity):

title = Required(str)

content = Required(str)

def before_insert(self):

print("Before insert! title=%s" % self.title)

orm设置bool型 python_详解python的ORM中Pony用法相关推荐

  1. python怎么设置七牛云_详解Python在七牛云平台的应用(一)

    七牛云七牛云是国内领先的企业级云服务商.专注于以数据为核心的云计算业务,围绕富媒体场景推出了对象存储.融合CDN.容器云.大数据.深度学习平台等产品,并提供一站式视频云解决方案,同时打造简单,可信赖的 ...

  2. orm设置bool型 python_python基础教程之基本内置数据类型介绍

    Python基本内置数据类型有哪些 一些基本数据类型,比如:整型(数字).字符串.元组.列表.字典和布尔类型. 随着学习进度的加深,大家还会接触到更多更有趣的数据类型,python初学者入门时先了解这 ...

  3. pptx库ppt演示 python_详解 Python 操作 PPT 的各种骚操作!

    1.python-pptx模块简介 使用python操作PPT,需要使用的模块就是python-pptx,下面来对该模块做一个简单的介绍. 这里提前做一个说明:python操作PPT,最好是我们提前设 ...

  4. orm设置bool型 python_Python SQLAlchemy入门教程

    本文将以Mysql举例,介绍sqlalchemy的基本用法.其中,Python版本为2.7,sqlalchemy版本为1.1.6. 一. 介绍 SQLAlchemy是Python中最有名的ORM工具. ...

  5. orm设置bool型 python_Python orm.relationship方法代码示例

    本文整理汇总了Python中sqlalchemy.orm.relationship方法的典型用法代码示例.如果您正苦于以下问题:Python orm.relationship方法的具体用法?Pytho ...

  6. python yield from yield_python yield和yield from用法总结详解 python yield和yield from用法总结...

    #!/usr/bin/env python # -*- coding: utf-8 -*-from inspect import isgeneratorfunction def fab(max): n ...

  7. 详解Python类定义中的各种方法

    首先应该明确,在面向对象程序设计中,函数和方法这两个概念是有本质区别的.方法一般指与特定实例绑定的函数,通过对象调用方法时,对象本身将被作为第一个参数传递过去,普通函数并不具备这个特点. >&g ...

  8. 详解Python内置函数iter()用法

    iter()函数用来返回指定对象的迭代器,有两种用法:iter(iterable)和iter(callable, sentinel),前者要求参数必须为序列或者有自己的迭代器,后者会持续调用参数cal ...

  9. linux if 的用法详解,Linux有关Shell中if用法笔记

    shell中的if主要是用于程序的判断逻辑,从而控制脚本的执行逻辑.这和很多编程语言思路上都是一致的. 1.if的用法结构如下: if exp;then command1; command2; fi ...

最新文章

  1. 用setx设置永久环境变量及注意事项
  2. office频繁显示停止工作
  3. python文件名有空格_python 解决Windows平台上路径有空格的问题
  4. 【学术相关】RSPapers | 工业界推荐系统论文合集
  5. 网络的分层思想和数据封装与解封装概论
  6. JavaScript的调用栈、回调队列和事件循环
  7. 10060 mysql_navicat连接mysql服务端报10060错误解决过程如下
  8. hadoop合并日志_【hadoop】24.MapReduce-shuffle之合并
  9. ZOJ 3761 Easy billiards 月赛E DFS
  10. 如何以nobody用户执行命令?
  11. 单链表删除所有值为x的元素_双链表的基本实现与讲解(C++描述)
  12. iOS 使用CocoaPods
  13. Error running ‘x‘: Command line is too long. Shorten command line for x or also for Application
  14. flex bison 下载
  15. 【硬刚Hive】MYSQL/HIVESQL笔试题(七):HIVESQL(七)
  16. 怎么把ide改成ahci_不重装系统如何开启ahci模式_不重装系统ahci改ide模式的方法...
  17. Python爬虫 | 手把手教你扒一扒贝壳网成交房源数据
  18. 北京二手房市场价量齐升 上演“大逆转”
  19. 《漫步华尔街》书中的精髓:在美国市场中,怎样用“随机漫步”的投资方法让自己的投资收益稳步增长
  20. Java基础Day05

热门文章

  1. win7 iis php5.3,win7 下安装 iis7.5+php5.3的配置方法(图文)
  2. win32 disk imager使用后u盘容量恢复
  3. Word2Vec算法详解(CBOW和skip-gram算法详解)
  4. NLP --- 产生式模型VS判别式模型
  5. 卡饭里的云计算机,微云可以在电脑用吗
  6. python中ht_python – 如何在Google App Engine上正确安装ht...
  7. html页面画一个矩形,使用HTML5 canvas绘制一个矩形的方法
  8. java形参、实参、值传递、引用传递
  9. BZOJ4597 SHOI2016随机序列(线段树)
  10. 通过bin-log对mysql进行数据恢复