您好,登錄后才能下訂單哦!
怎么在Python中實現ORM編程?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
ORM編程
ORM(object-relational mapping)對象關系映射 作用:在關系型數據庫和業務實體對象之間做一個映射,方便在開發中,不需要再使用復雜的sql語句,只需要簡單操作對象的屬性與方法。 所有ORM具備3方面基本能力:映射技術、CRUD操作、緩存優化。每種編程語言都具有自己的ORM庫,java 的Hibernate、IBATIS;C#的Grove LINQ; Python 的 SQLAlchemy
1、映射技術
面向對象是從軟件工程的基本原則(如耦合、聚合、封裝)的基礎由來 關系型數據庫是從數學理論上的基礎發展而來。
ORM庫需解決三個問題:
數據類型映射:將數據庫的類型映射為編程語言自身的類型;
類映射:將數據表定義映射為編程語言自身的類;
關系映射:將數據庫中基于外鍵的關系連接轉換為編程語言中基于對象引用的關系連接。
2、CRUD操作
C–Create(增加)
R–Retrieve(讀取,重新得到數據)
U–Update(更新)
D–Delete(刪除)
在SQL中:insert,select, update,delete四種語句實現CRUD
ORM自動實現以下操作:
將這些調用轉換為SQL語句;
通過數據庫引擎發送個給數據庫執行;
將數據庫返回的結果記錄用ORM映射技術轉換為類對象。
3、緩存優化
將從數據庫中查詢到的數據以類對象形式保存在本地內存中,以便之后再用時隨時抽取。
在真正需要讀取查詢結果時才執行數據庫的select操作,而不是在ORM查詢命令執行時查詢數據庫。
4、用peewee進行ORM數據庫編程
思路:
導入需要的包:peewee,建立一個數據庫引擎對象db
定義一個ORM基類:BaseModel(),建立SQLite連接
類型映射:定義一些數據類型
表映射:定義兩個對象類:course, teacher
關系映射:使用ForeignKeyField 設置與course的連接關系,其中的參數:to_field用于指定被連接的字段名,related_name參數對該關系賦予了一個名字
import os if os.path.exists('sampleDB.db'): os.remove('sampleDB.db') # 引入peewee包的所有內容 from peewee import * # 建立一個Sqlite數據庫引擎對象,該引擎打開數據庫文件sampleDB.db db = SqliteDatabase("sampleDB.db") # 定義一個ORM的基類,在基類中指定本ORM所使用的數據庫, # 這樣在之后所有的子類中就不用重復聲明數據庫 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' # 定義數據庫中的表名 # 定義 teacher 表,繼承自BaseModel class Teacher(BaseModel): id = PrimaryKeyField() name = CharField(null=False) gender = BooleanField() # 布爾型 address = CharField() # ForeignKeyField 設置與course的連接關系,其中的參數:to_field用于指定被連接的字段名,related_name參數對該關系賦予了一個名字 course_id = ForeignKeyField(Course, to_field="id", related_name="course") class Meta: order_by = ('name',) db_table = "teacher" # 建表,僅需創建一次 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=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 == '大學英語') print("課程:%s, 學時:%d, 課程類型: %s" % (record.title, record.period, record.description)) # 更新 record.period = 200 record.save() # 刪除 record.delete_instance() # 查詢所有記錄 courses = Course.select() for i in courses: print(i.id, i.title, i.period, i.description) # 帶條件查詢,并將結果按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) # 統計所有課程的平均學時 total = Course.select(fn.Avg (Course.period).alias('avg_period')) for i in total: print(u"平均學時:", i.avg_period) # 更新多個記錄 Course.update(period=300).where(Course.id > 100).execute() # 多表連接操作,Peewee會自動根據ForeignKeyField的外鍵定義進行連接: Record = Course.select().join(Teacher).where(Teacher.gender == True) for i in Record: print(i.id, i.title, i.period, i.description)
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。