最近阅读了Flask的源码,弄懂了原理之后就想尝试来实现自己的一个Web框架。
因为大部分的实现思路都参照Flask0.1
版本,也就是最初版本的思路。所用的基本库是werkzeug
。
框架的完整代码都放在了Github上,之后会继续更新:https://github.com/jyz0309/WebFrame
求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):
def isNum(self,value):
try:
value + 1
except 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
有了查询操作之后,更新和删除操作也就迎刃而解,完整代码在我的GitHub上,GitHub地址在文章开头,各位给个star吧T T