怎么在Python中實(shí)現(xiàn)ORM編程-創(chuàng)新互聯(lián)

怎么在Python中實(shí)現(xiàn)ORM編程?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、文昌網(wǎng)站維護(hù)、網(wǎng)站推廣。

ORM編程

ORM(object-relational mapping)對(duì)象關(guān)系映射 作用:在關(guān)系型數(shù)據(jù)庫和業(yè)務(wù)實(shí)體對(duì)象之間做一個(gè)映射,方便在開發(fā)中,不需要再使用復(fù)雜的sql語句,只需要簡單操作對(duì)象的屬性與方法。 所有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庫需解決三個(gè)問題:

  • 數(shù)據(jù)類型映射:將數(shù)據(jù)庫的類型映射為編程語言自身的類型;

  • 類映射:將數(shù)據(jù)表定義映射為編程語言自身的類;

  • 關(guān)系映射:將數(shù)據(jù)庫中基于外鍵的關(guān)系連接轉(zhuǎn)換為編程語言中基于對(duì)象引用的關(guān)系連接。

2、CRUD操作

  • C–Create(增加)

  • R–Retrieve(讀取,重新得到數(shù)據(jù))

  • U–Update(更新)

  • D–Delete(刪除)

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

ORM自動(dòng)實(shí)現(xiàn)以下操作:

  1. 將這些調(diào)用轉(zhuǎn)換為SQL語句;

  2. 通過數(shù)據(jù)庫引擎發(fā)送個(gè)給數(shù)據(jù)庫執(zhí)行;

  3. 將數(shù)據(jù)庫返回的結(jié)果記錄用ORM映射技術(shù)轉(zhuǎn)換為類對(duì)象。

3、緩存優(yōu)化

  • 將從數(shù)據(jù)庫中查詢到的數(shù)據(jù)以類對(duì)象形式保存在本地內(nèi)存中,以便之后再用時(shí)隨時(shí)抽取。

  • 在真正需要讀取查詢結(jié)果時(shí)才執(zhí)行數(shù)據(jù)庫的select操作,而不是在ORM查詢命令執(zhí)行時(shí)查詢數(shù)據(jù)庫。

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

思路:

  • 導(dǎo)入需要的包:peewee,建立一個(gè)數(shù)據(jù)庫引擎對(duì)象db

  • 定義一個(gè)ORM基類:BaseModel(),建立SQLite連接

  • 類型映射:定義一些數(shù)據(jù)類型

  • 表映射:定義兩個(gè)對(duì)象類: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ù)庫引擎對(duì)象,該引擎打開數(shù)據(jù)庫文件sampleDB.db
db = SqliteDatabase("sampleDB.db")
# 定義一個(gè)ORM的基類,在基類中指定本ORM所使用的數(shù)據(jù)庫,
# 這樣在之后所有的子類中就不用重復(fù)聲明數(shù)據(jù)庫
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ù)庫中的表名
# 定義 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é)英語', 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='張雯雯', gender=False, address='..', course_id=2)
# 查詢一行
record = Course.get(Course.title == '大學(xué)英語')
print("課程:%s, 學(xué)時(shí):%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)
# 帶條件查詢,并將結(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)

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司的支持。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、網(wǎng)站設(shè)計(jì)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享題目:怎么在Python中實(shí)現(xiàn)ORM編程-創(chuàng)新互聯(lián)
URL分享:http://muchs.cn/article44/csgeee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、微信公眾號(hào)、用戶體驗(yàn)、全網(wǎng)營銷推廣服務(wù)器托管、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)