在之前的文章中我們或多或少的介紹了關於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 '<%s:%s>' % (self.__class__.__name__,self.name) class StringField(Field): def __init__(self,name=None,primary_key=False,default=None,ddl='varchar(100)'): super(StringField,self).__init__(name,ddl,primary_key,default) # 其它字段略,一个道理,一个模式
以上是一文詳解Python網站開發會用到哪些orm框架的詳細內容。更多資訊請關注PHP中文網其他相關文章!