Python ORM編程基礎(chǔ)示例
本文實(shí)例講述了Python ORM編程。分享給大家供大家參考,具體如下:
ORM編程
ORM(object-relational mapping)對(duì)象關(guān)系映射 作用:在關(guān)系型數(shù)據(jù)庫(kù)和業(yè)務(wù)實(shí)體對(duì)象之間做一個(gè)映射,方便在開(kāi)發(fā)中,不需要再使用復(fù)雜的sql語(yǔ)句,只需要簡(jiǎn)單操作對(duì)象的屬性與方法。 所有ORM具備3方面基本能力:映射技術(shù)、CRUD操作、緩存優(yōu)化。每種編程語(yǔ)言都具有自己的ORM庫(kù),java 的Hibernate、IBATIS;C#的Grove LINQ; Python 的 SQLAlchemy
1、映射技術(shù)
面向?qū)ο笫菑能浖こ痰幕驹瓌t(如耦合、聚合、封裝)的基礎(chǔ)由來(lái) 關(guān)系型數(shù)據(jù)庫(kù)是從數(shù)學(xué)理論上的基礎(chǔ)發(fā)展而來(lái)。
ORM庫(kù)需解決三個(gè)問(wèn)題:
- 數(shù)據(jù)類(lèi)型映射:將數(shù)據(jù)庫(kù)的類(lèi)型映射為編程語(yǔ)言自身的類(lèi)型;
- 類(lèi)映射:將數(shù)據(jù)表定義映射為編程語(yǔ)言自身的類(lèi);
- 關(guān)系映射:將數(shù)據(jù)庫(kù)中基于外鍵的關(guān)系連接轉(zhuǎn)換為編程語(yǔ)言中基于對(duì)象引用的關(guān)系連接。
2、CRUD操作
- C–Create(增加)
- R–Retrieve(讀取,重新得到數(shù)據(jù))
- U–Update(更新)
- D–Delete(刪除)
在SQL中:insert,select, update,delete四種語(yǔ)句實(shí)現(xiàn)CRUD
ORM自動(dòng)實(shí)現(xiàn)以下操作:
- 將這些調(diào)用轉(zhuǎn)換為SQL語(yǔ)句;
- 通過(guò)數(shù)據(jù)庫(kù)引擎發(fā)送個(gè)給數(shù)據(jù)庫(kù)執(zhí)行;
- 將數(shù)據(jù)庫(kù)返回的結(jié)果記錄用ORM映射技術(shù)轉(zhuǎn)換為類(lèi)對(duì)象。
3、緩存優(yōu)化
- 將從數(shù)據(jù)庫(kù)中查詢(xún)到的數(shù)據(jù)以類(lèi)對(duì)象形式保存在本地內(nèi)存中,以便之后再用時(shí)隨時(shí)抽取。
- 在真正需要讀取查詢(xún)結(jié)果時(shí)才執(zhí)行數(shù)據(jù)庫(kù)的select操作,而不是在ORM查詢(xún)命令執(zhí)行時(shí)查詢(xún)數(shù)據(jù)庫(kù)。
4、用peewee進(jìn)行ORM數(shù)據(jù)庫(kù)編程
思路:
- 導(dǎo)入需要的包:peewee,建立一個(gè)數(shù)據(jù)庫(kù)引擎對(duì)象db
- 定義一個(gè)ORM基類(lèi):BaseModel(),建立SQLite連接
- 類(lèi)型映射:定義一些數(shù)據(jù)類(lèi)型
- 表映射:定義兩個(gè)對(duì)象類(lèi):course, teacher
- 關(guān)系映射:使用ForeignKeyField 設(shè)置與course的連接關(guān)系,其中的參數(shù):to_field用于指定被連接的字段名,related_name參數(shù)對(duì)該關(guān)系賦予了一個(gè)名字
import os
if os.path.exists('sampleDB.db'):
os.remove('sampleDB.db')
# 引入peewee包的所有內(nèi)容
from peewee import *
# 建立一個(gè)Sqlite數(shù)據(jù)庫(kù)引擎對(duì)象,該引擎打開(kāi)數(shù)據(jù)庫(kù)文件sampleDB.db
db = SqliteDatabase("sampleDB.db")
# 定義一個(gè)ORM的基類(lèi),在基類(lèi)中指定本ORM所使用的數(shù)據(jù)庫(kù),
# 這樣在之后所有的子類(lèi)中就不用重復(fù)聲明數(shù)據(jù)庫(kù)
class BaseModel(Model):
class Meta:
database = db
# 定義course表,繼承自BaseModel
class Course(BaseModel):
id = PrimaryKeyField() # 定義主鍵
title = CharField(null=False) # 定義字符串
period = IntegerField() # 整型
description = CharField()
class Meta:
order_by = ('title',)
db_table = 'course' # 定義數(shù)據(jù)庫(kù)中的表名
# 定義 teacher 表,繼承自BaseModel
class Teacher(BaseModel):
id = PrimaryKeyField()
name = CharField(null=False)
gender = BooleanField() # 布爾型
address = CharField()
# ForeignKeyField 設(shè)置與course的連接關(guān)系,其中的參數(shù):to_field用于指定被連接的字段名,related_name參數(shù)對(duì)該關(guān)系賦予了一個(gè)名字
course_id = ForeignKeyField(Course, to_field="id", related_name="course")
class Meta:
order_by = ('name',)
db_table = "teacher"
# 建表,僅需創(chuàng)建一次
Course.create_table()
Teacher.create_table()
# 新增行
Course.create(id=1, title='經(jīng)濟(jì)學(xué)', period=320, description='文理科學(xué)生均可選修')
Course.create(id=2, title='大學(xué)英語(yǔ)', period=300, description='大一學(xué)生必修課')
Course.create(id=3, title='哲學(xué)', period=100, description='必修課')
Course.create(id=134, title='編譯原理', period=100, description='計(jì)算機(jī)系選修')
Teacher.create(name='白陣君', gender=True, address='..', course_id=1)
Teacher.create(name='李森', gender=True, address='..', course_id=3)
Teacher.create(name='張?chǎng)?, gender=False, address='..', course_id=2)
# 查詢(xún)一行
record = Course.get(Course.title == '大學(xué)英語(yǔ)')
print("課程:%s, 學(xué)時(shí):%d, 課程類(lèi)型: %s" % (record.title, record.period, record.description))
# 更新
record.period = 200
record.save()
# 刪除
record.delete_instance()
# 查詢(xún)所有記錄
courses = Course.select()
for i in courses:
print(i.id, i.title, i.period, i.description)
# 帶條件查詢(xún),并將結(jié)果按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.description)
# 統(tǒng)計(jì)所有課程的平均學(xué)時(shí)
total = Course.select(fn.Avg (Course.period).alias('avg_period'))
for i in total:
print(u"平均學(xué)時(shí):", i.avg_period)
# 更新多個(gè)記錄
Course.update(period=300).where(Course.id > 100).execute()
# 多表連接操作,Peewee會(huì)自動(dòng)根據(jù)ForeignKeyField的外鍵定義進(jìn)行連接:
Record = Course.select().join(Teacher).where(Teacher.gender == True)
for i in Record:
print(i.id, i.title, i.period, i.description)
參考來(lái)源:書(shū)籍《python 高效開(kāi)發(fā)實(shí)戰(zhàn)》
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》、《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- Python的ORM框架SQLAlchemy入門(mén)教程
- Python ORM框架SQLAlchemy學(xué)習(xí)筆記之?dāng)?shù)據(jù)添加和事務(wù)回滾介紹
- Python ORM框架SQLAlchemy學(xué)習(xí)筆記之安裝和簡(jiǎn)單查詢(xún)實(shí)例
- Python ORM框架SQLAlchemy學(xué)習(xí)筆記之?dāng)?shù)據(jù)查詢(xún)實(shí)例
- Python的ORM框架SQLObject入門(mén)實(shí)例
- Python ORM框架SQLAlchemy學(xué)習(xí)筆記之關(guān)系映射實(shí)例
- python orm 框架中sqlalchemy用法實(shí)例詳解
- Python的Django框架中forms表單類(lèi)的使用方法詳解
- 在Python的Flask中使用WTForms表單框架的基礎(chǔ)教程
相關(guān)文章
使用beaker讓Facebook的Bottle框架支持session功能
這篇文章主要介紹了使用beaker讓Facebook的Bottle框架支持session功能,session在Python的Django等框架中內(nèi)置但在Bottle中并沒(méi)有被集成,需要的朋友可以參考下2015-04-04
Django自定義分頁(yè)與bootstrap分頁(yè)結(jié)合
這篇文章主要為大家詳細(xì)介紹了Django自定義分頁(yè)與bootstrap分頁(yè)結(jié)合使用的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Python實(shí)現(xiàn)輸出某區(qū)間范圍內(nèi)全部素?cái)?shù)的方法
這篇文章主要介紹了Python實(shí)現(xiàn)輸出某區(qū)間范圍內(nèi)全部素?cái)?shù)的方法,涉及Python數(shù)值運(yùn)算、排序、判斷等相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
Jupyter Notebook 遠(yuǎn)程訪問(wèn)配置詳解
這篇文章主要介紹了Jupyter Notebook 遠(yuǎn)程訪問(wèn)配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

