国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python ORM編程基礎(chǔ)示例

2020-02-15 21:27:48
字體:
供稿:網(wǎng)友

本文實例講述了Python ORM編程。分享給大家供大家參考,具體如下:

ORM編程

ORM(object-relational mapping)對象關(guān)系映射 作用:在關(guān)系型數(shù)據(jù)庫和業(yè)務(wù)實體對象之間做一個映射,方便在開發(fā)中,不需要再使用復(fù)雜的sql語句,只需要簡單操作對象的屬性與方法。 所有ORM具備3方面基本能力:映射技術(shù)、CRUD操作、緩存優(yōu)化。每種編程語言都具有自己的ORM庫,java 的Hibernate、IBATIS;C#的Grove LINQ; Python 的 SQLAlchemy

1、映射技術(shù)

面向?qū)ο笫菑能浖こ痰幕驹瓌t(如耦合、聚合、封裝)的基礎(chǔ)由來 關(guān)系型數(shù)據(jù)庫是從數(shù)學(xué)理論上的基礎(chǔ)發(fā)展而來。

ORM庫需解決三個問題:

數(shù)據(jù)類型映射:將數(shù)據(jù)庫的類型映射為編程語言自身的類型; 類映射:將數(shù)據(jù)表定義映射為編程語言自身的類; 關(guān)系映射:將數(shù)據(jù)庫中基于外鍵的關(guān)系連接轉(zhuǎn)換為編程語言中基于對象引用的關(guān)系連接。

2、CRUD操作

C–Create(增加) R–Retrieve(讀取,重新得到數(shù)據(jù)) U–Update(更新) D–Delete(刪除)

在SQL中:insert,select, update,delete四種語句實現(xiàn)CRUD

ORM自動實現(xiàn)以下操作:

    將這些調(diào)用轉(zhuǎn)換為SQL語句; 通過數(shù)據(jù)庫引擎發(fā)送個給數(shù)據(jù)庫執(zhí)行; 將數(shù)據(jù)庫返回的結(jié)果記錄用ORM映射技術(shù)轉(zhuǎn)換為類對象。

3、緩存優(yōu)化

將從數(shù)據(jù)庫中查詢到的數(shù)據(jù)以類對象形式保存在本地內(nèi)存中,以便之后再用時隨時抽取。 在真正需要讀取查詢結(jié)果時才執(zhí)行數(shù)據(jù)庫的select操作,而不是在ORM查詢命令執(zhí)行時查詢數(shù)據(jù)庫。

4、用peewee進(jìn)行ORM數(shù)據(jù)庫編程

思路:

導(dǎo)入需要的包:peewee,建立一個數(shù)據(jù)庫引擎對象db 定義一個ORM基類:BaseModel(),建立SQLite連接 類型映射:定義一些數(shù)據(jù)類型 表映射:定義兩個對象類:course, teacher 關(guān)系映射:使用ForeignKeyField 設(shè)置與course的連接關(guān)系,其中的參數(shù):to_field用于指定被連接的字段名,related_name參數(shù)對該關(guān)系賦予了一個名字
import osif os.path.exists('sampleDB.db'):  os.remove('sampleDB.db')# 引入peewee包的所有內(nèi)容from peewee import *# 建立一個Sqlite數(shù)據(jù)庫引擎對象,該引擎打開數(shù)據(jù)庫文件sampleDB.dbdb = SqliteDatabase("sampleDB.db")# 定義一個ORM的基類,在基類中指定本ORM所使用的數(shù)據(jù)庫,# 這樣在之后所有的子類中就不用重復(fù)聲明數(shù)據(jù)庫class BaseModel(Model):  class Meta:    database = db# 定義course表,繼承自BaseModelclass Course(BaseModel):  id = PrimaryKeyField() # 定義主鍵  title = CharField(null=False) # 定義字符串  period = IntegerField() # 整型  description = CharField()  class Meta:    order_by = ('title',)    db_table = 'course'  # 定義數(shù)據(jù)庫中的表名# 定義 teacher 表,繼承自BaseModelclass Teacher(BaseModel):  id = PrimaryKeyField()  name = CharField(null=False)  gender = BooleanField() # 布爾型  address = CharField()  # ForeignKeyField 設(shè)置與course的連接關(guān)系,其中的參數(shù):to_field用于指定被連接的字段名,related_name參數(shù)對該關(guān)系賦予了一個名字  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)濟學(xué)', period=320, description='文理科學(xué)生均可選修')Course.create(id=2, title='大學(xué)英語', period=300, description='大一學(xué)生必修課')Course.create(id=3, title='哲學(xué)', period=100, description='必修課')Course.create(id=134, title='編譯原理', period=100, description='計算機系選修')Teacher.create(name='白陣君', gender=True, address='..', course_id=1)Teacher.create(name='李森', gender=True, address='..', course_id=3)Teacher.create(name='張雯雯', gender=False, address='..', course_id=2)# 查詢一行record = Course.get(Course.title == '大學(xué)英語')print("課程:%s, 學(xué)時:%d, 課程類型: %s" % (record.title, record.period, record.description))# 更新record.period = 200record.save()# 刪除record.delete_instance()# 查詢所有記錄courses = Course.select()for i in courses:  print(i.id, i.title, i.period, i.description)# 帶條件查詢,并將結(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)計所有課程的平均學(xué)時total = Course.select(fn.Avg (Course.period).alias('avg_period'))for i in total:  print(u"平均學(xué)時:", i.avg_period)# 更新多個記錄Course.update(period=300).where(Course.id > 100).execute()# 多表連接操作,Peewee會自動根據(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)            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 江孜县| 红原县| 河曲县| 山西省| 乐清市| 新余市| 共和县| 惠州市| 河曲县| 喀喇| 喀喇沁旗| 海原县| 张家港市| 武陟县| 灵武市| 白沙| 常州市| 镇赉县| 和静县| 西乡县| 新疆| 平谷区| 铜鼓县| 舞阳县| 宝兴县| 新野县| 钟祥市| 麻城市| 梨树县| 凉山| 张家界市| 迭部县| 夏邑县| 孟村| 甘孜县| 恭城| 原平市| 苏尼特右旗| 杨浦区| 鄂托克前旗| 青川县|