最近閱讀了flask的原始碼,弄懂了原理之後就想嘗試來實現自己的乙個web框架。
因為大部分的實現思路都參照flask0.1
版本,也就是最初版本的思路。所用的基本庫是werkzeug
。
框架的完整**都放在了github上,之後會繼續更新:
求star,球球了t_t
在完成了框架的最基本的get、post之後,我們開始編寫自己的資料庫orm,目前我只寫了支援mysql的orm,並且暫時只支援增刪改查的最基本的功能,使用pymysql作為底層庫。
首先,先定義資料庫的連線,這個很簡單,直接封裝乙個connect()
函式即可。當然也可以像我一樣,在建立類的時候直接連線:
def
__init__
(self,name=
'test'
,table_name=
'sqltest'
,host=
'localhost'
,user=
'******'
,password=
'******'):
self.name = name
self.table_name = table_name
self.con = pymysql.connect(host=host,user=user,password=password,database=self.name)
self.cursor = self.con.cursor(
)
測試可以連線成功後,接下來的工作就是定義資料庫要操作的表的屬性,在這裡定義了乙個類field
來表示表的列名,詳細原因在後面說明,首先來看看最基本的增加操作:
def
insert
(self,
**kwargs)
:#cursor = self.cursor
condition =
''for key in kwargs:
condition +=
str(kwargs[key])+
',' condition = condition.rstrip(
',')
# 處理引數字典,然後插入sql語句中
sql =
"insert into "
+self.table_name+
" values ("
+condition+
");"
try:
# 嘗試
self.cursor.execute(sql)
self.con.commit(
)except
:# 發出錯誤
raise exception
增加操作是最基礎的操作,而且沒有對資料庫表進行讀操作的需求,所以寫起來較為簡單,基本操作就是通過**kwargs
將引數變為元組或者字典,然後對其進行處理,插入到sql語句中執行。
接下來是查詢操作,查詢函式因為需要將條件寫入到函式的引數裡,就像這樣:
search(x<=
1,y==
1)
所以需要將表的屬性的類field
的運算子過載,也就是__eq__、__lt__、__gt__、__le__、__ge__、__ne__
這幾個,他們分別對應的是==,<=,>=,<,>,!=這幾個符號,這也是為什麼要用將表的列名使用類來定義:
class
field
(object):
defisnum
(self,value)
:try
: value +
1except typeerror:
return
false
else
:return
true
def__init__
(self,name)
: self.name = name
def__eq__
(self, other):if
isinstance
(other,
str)
:return
str(self.name)
+'=\''
+str
(other)
+'\''
else
:if other ==
none
:return
str(self.name)
+'='
+str
('null'
)return
str(self.name)
+'='
+str
(other)
def__lt__
(self, other)
:if self.isnum(other)
:return
str(self.name)
+'<'
+str
(other)
else
:raise typeerror
def__gt__
(self, other)
:if self.isnum(other)
:return
str(self.name)
+'>'
+str
(other)
else
:raise typeerror
def__le__
(self,other)
:if self.isnum(other)
:return
str(self.name)
+'<='
+str
(other)
else
:raise typeerror
def__ge__
(self,other)
:if self.isnum(other)
:return
str(self.name)
+'>='
+str
(other)
else
:raise typeerror
def__ne__
(self, other):if
isinstance
(other,
str)
:return
str(self.name)
+'!=\''
+str
(other)
+'\''
else
:if other ==
none
:return
str(self.name)
+'='
+str
('null'
)return
str(self.name)
+'!='
+str
(other)
這是類中的運算子過載。
接下來是查詢操作的函式:
def
search
(self,
*args)
: condition =
''for i in args:
condition += i+
',' condition = condition.rstrip(
',')
sql =
'select * from '
+self.table_name+
' where ('
+condition+
');'
self.cursor.execute(sql)
result = self.cursor.fetchall(
)return result
從零開始學Python
第三章 字典 1.建立字典 book 其中值可以是任意型別,可以是元組或者字典.2.dict函式建立字典 通過對映建立 book d book.dict 輸出d book 通過關鍵字建立 d dict name zq age 1 輸出d 3.字典的格式化字串 鍵 s 字典名 book name is...
從零開始學Python
第十一章 檔案操作 1.開啟檔案 用open 函式,直接用就可以。open name mode buffering 呼叫open 之後會返回乙個檔案物件,mode 模式,buffering 緩衝都是可以選擇的。f open r 檔案路徑 2.檔案模式 r 讀模式 w 寫模式 a 追加模式 b 二進位...
Python從零開始(1)
學習一門程式語言首先要從計算機基礎常識開始,畢竟程式語言是跟計算機交流的語言。計算機分為硬體系統和軟體系統,從硬體系統說起,硬體系統就是大家可以看得到摸得著的計算機系統,大部分都藏在主機箱中,硬體系統有很多,這裡就說一些主要的 1.cpu,這個就是 處理器,計算機的運算核心,控制核心,是計算機最重要...