首頁  >  文章  >  後端開發  >  一文詳解Python網站開發會用到哪些orm框架

一文詳解Python網站開發會用到哪些orm框架

Tomorin
Tomorin原創
2018-08-23 17:47:211473瀏覽

在之前的文章中我們或多或少的介紹了關於Python的知識,並且到了是實戰中,我們就要用python開發頁面,其實,用框架開發頁面,是最簡單的,也是最輕鬆的。本章,我們就要介紹Python頁面開發中的用orm框架#開發頁面。

什麼是orm

#ORM Object Relational Mapping,全名為物件關係對映。

可是它到底是乾啥的呢?
如果接觸過一些web後台的化,我們知道web後台有很大一部分工作都是資料的增刪改查,如果每次操作資料庫都要連接資料庫,建構sql語句,執行sql語句的話,那未免太麻煩了,所以我們可以將資料庫中的表,字段,行,與我們的物件導向程式設計中的類,類別的屬性,以及物件建立一一對應的映射關係,這樣我們便可以避免直接操作資料庫,而只要呼叫對應的方法就可以了。
拿我過去的做法舉個例子就明白了,比如實現一個用戶註冊,以前我是怎麼做的,前台拿到數據,傳給後台,然後後台字符串拼接形成sql語句,後台執行。
而有了ORM以後,我只需要用資料實例化一個User對象,然後呼叫該對象的save方法,便保存到了資料庫,作為使用者的角度,不需要操作一句sql語句。
假設User類別對應users表

user=User(id="100001",name="Andy",password="*****")
user.save()  //保存到数据库
user=User.findById("100001") #从数据库中找出id为"100001"的用户
user.update(password="*********")  #更改id为"100001"的用户密码
users=User.findAll() #取出users表中全部数据

我就問,這樣用起來不爽嗎?

注意

IO運算皆為非同步,用到的非同步函式庫為asyncio
連結的資料庫為mysql 5.7,用到的mysql異步IO驅動為aiomysql

實作ORM的必要準備---封裝資料庫操作

##建立資料庫連接池

import asyncioimport aiomysql       
async def create_pool(**kw):global __pool
__pool=await aiomysql.create_pool(
    host=kw.get('host','localhost'),
    port=kw.get('port',3306),
    user=kw['user'],
    password=kw['password'],
    db=kw['db'],
    charset=kw.get('charset','utf8'),
    autocommit=kw.get('autocommit',True), # 自动提交事务
    maxsize=kw.get('maxsize',10),  # 池中最多有10个链接对象
    minsize=kw.get('minsize',1),
)

封裝select方法

async def select(sql,args,size=None): //size可以决定取几条
global __pool
with (await __pool) as conn:
    cur=await conn.cursor(aiomysql.DictCursor) 
    # 用参数替换而非字符串拼接可以防止sql注入
    await cur.execute(sql.replace('?','%s'),args)  
    if size:
        rs=await cur.fetchmany(size) 
    else:
        rs=await cur.fetchall()  
    await cur.close()
    return rs

除了select方法要回傳查詢內容,剩下的update, insert,delete皆只需傳回一個影響行數,所以可將它們三個封裝為一個execute方法

def execute(sql,args):
global __pool
try:    
    with (await __pool) as conn:
      cur=await conn.cursor()        
         await cur.execute(sql.replace('?', '%s'), args)
      affected=cur.rowcount
         await cur.close()
except BaseException as e:
    raise e
return affected

開始動手實作ORM

程式設計中有個想法叫做」自頂向下「。所以當你對如何設計

ORM無從下手的時候,你可以假設已經有一個ORM框架,你想怎麼用?

class Model(object):
    async def find(self):
       pass
class User(Model):
    # 注意这里的都是类属性
    __table__="users"
    id=StringField(...)
    name=StringField(...)
user=User(id="10001",name="Andy")
user.save()

有沒有發現,這樣看User類,很清楚,對應user表,這個表有哪些字段,一目了然。然後讓子類別繼承父類,實作對find,save...等方法的複用。真是完美,可是怎麼實現呢?

字段类的实现

class Field(object):
  def __init__(self,name,column_type,primary_key,default):  
     self.name=name # 字段名
    self.column_type=column_type # 字段数据类型
    self.primary_key=primary_key  # 是否是主键
    self.default=default  # 有无默认值
  def __str__(self):  
     return &#39;<%s:%s>&#39; % (self.__class__.__name__,self.name)  
   class StringField(Field):
    def __init__(self,name=None,primary_key=False,default=None,ddl=&#39;varchar(100)&#39;): 
      super(StringField,self).__init__(name,ddl,primary_key,default)
  # 其它字段略,一个道理,一个模式


以上是一文詳解Python網站開發會用到哪些orm框架的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn