用python简单实现类似thinkphp的针对Mysql操作的数据模型

摘自以前CI实现的商城系统,做APP时需要实现数据接口,便用python实现了。


假设有表tp_article

id title type
1 哈哈 1
2 图样涂森坡 1

使用thinphp实现取出type为1的数据如下

M()->from(‘‘tp_article‘‘)->where(‘type=1‘)->select();


现通过python实现类似对mysql进行操作的封装

DB.select(‘*‘).fm(‘tp_article‘).where(‘type‘,1).all()


需要:django下的db模块


首先实现 mydb.py 文件,放于core目录下,实现模型类文件时需要import

from django.db import connection
cursor = connection.cursor()
'''
Simple function for one result sql
'''
#返回一条结果
def fetchone(sql):
    cursor.execute(sql)
    try:
        col_names = [row[0] for row in cursor.description]
        rs = dict(zip(col_names,cursor.fetchone()))        
    except:
        rs = {}    
          
    return rs
<pre name="code" class="python">#返回多条结果
def fetchall(sql): cursor.execute(sql) try: col_names = [row[0] for row in cursor.description] data = cursor.fetchall() rs = [dict(zip(col_names,raw)) for raw in data] except: rs=[] return rs



然后就是实现模型类文件db_mysql.py


from core.mydb  import *

class Db_mysql(object):
    '''build sql'''
    sql=''
    options={}
    history=[]
    
    def select(self,fields):
        select_list = fields.split(',')
        self.options['select']=select_list
        return self
    #实现from,因为from是python保留关键词,所以用fm代替
    def fm(self,table):
        
        self.options['from'] = table
        return self
    
    def where(self,seg,*args):
        '''
        sql query of where tag
        '''
        try:
            where_list=self.options['where']
        except:
            where_list=[]
        if isinstance(seg,str):
            try:
                where_list.append({'key':seg,'val':args[0],'type':args[1]})
            except:
                where_list.append({'key':seg,'val':args[0],'type':False})
        elif isinstance(seg,dict):
            for key in seg.keys():
                where_list.append({'key':key,'val':seg[key]})

        self.options['where']= where_list
        return self
    def where_in(self,key,val):
        if not isinstance(self.options['where'],list):
            self.options['where']=[]
        self.options['where'].append({'key':key,'val':str(val),'type':'in'})
        return self
    
    def like(self,key,words):
        if not isinstance(self.options['where'],list):
            self.options['where']=[]
        self.options['where'].append({'key':key,'val':str(words),'type':'like'})
        return self
    
    def join(self,table,on,type='left'):
        self.options['join']= {'table':table,'on':on,'type':type}
        return self
    
    def limit(self,offset=0,size=0):
        offset = int(offset)
        size = int(size)
        if size == 0:
            size=offset
            offset=0
        self.options['limit']= {'offset':str(offset),'size':str(size)}
        return self
    
    def order(self,oby,desc='desc'):
        self.options['order']={'order':str(oby),'desc':str(desc)}
        return self
    #组装sql就靠这个方法了 
    def combile_sql(self):
        '''
        combile select sql
        '''
        if not isinstance(self.options['select'],list):
            self.options['select']=['*']
            
        self.sql=''.join(['select '])
        length = len(self.options['select'])
        for i in range(length):
            fields = self.options['select'][i]
            if i==length-1:
                self.sql=''.join([self.sql,fields,' '])
                break
            self.sql=''.join([self.sql,fields,', '])
        '''
        combile from sql
        '''        
        self.sql=''.join([self.sql,' from ',self.options['from'],' '])
        '''
        combile join sql
        '''  
        try:
            if isinstance(self.options['join'],dict):
                join_str = self.options['join']
        except:
            pass
        else:
            self.sql=''.join([self.sql,join_str['type'],' join ',join_str['table'],' on ',join_str['on'],' '])
        '''
        combile where sql and where in sql
        '''        
        
        try:
            where_list = self.options['where']
        except:
            where_list = []
        else:
            if len(where_list):
                self.sql=''.join([self.sql,' where '])
            count=0
            for item in where_list:
                if count is 0:
                    segment = ' '
                else:
                    segment = ' AND '
                count=count+1
                if not item.get('type',False):
                    self.sql=''.join([self.sql,segment,item['key'],'=',str(item['val'])])
                elif item['type'] is 'in':
                    self.sql=''.join([self.sql,segment,item['key'],' in (',str(item['val']),') '])
                elif item['type'] is 'like':
                    self.sql=''.join([self.sql,segment,item['key'],' like %',str(item['val']),'% '])
        
        '''
        combile order sql
        '''
        try:
            order_dict = self.options['order']
            if isinstance(order_dict,dict):
                self.sql=''.join([self.sql,' order by ',order_dict['order'],' ',order_dict['desc']])   
        except:
            pass
                     
        '''
        combile limit sql
        '''
        try:
            self.sql=''.join([self.sql,' limit ',self.options['limit']['offset'],',',self.options['limit']['size']])
            self.history.append(self.sql)
            self.options = {}
        except KeyError:
            pass
        
        return self

   #查询操作,类似tp李的find
    def get(self,table=False):
        if not isinstance(table,bool):
            self.options['from']
        self.combile_sql()
        rs={}
        try:
            rs = fetchone(self.sql)
        except Exception as e:
            print e
            print self.sql
        self.sql=''
        return rs
    #查询操作,类似tp里的select
    def all(self,table=False):
        if not isinstance(table,bool):
            self.options['from']
        self.combile_sql()
        rs = []
        try:
            rs = fetchall(self.sql)
        except Exception as e:
            print e
            print self.sql
        self.sql=''
        return rs
    #修改操作
    def update(self,table=False,*args):
        
        if not isinstance(table,bool):
            self.sql=''.join(['update ',table,' set '])
        else:
            return False
<span style="white-space:pre">	</span>#判断方法接收的参数是字符串还是字典,做不同处理
        if isinstance(args[0],str):
            if isinstance(args[1],str):
                val = ''.join(["'",args[1],"'"])
            else:
                val = str(args[1])
            self.sql = ''.join([self.sql,args[0],'=',val,' '])
        elif isinstance(args[0],dict):
            count=0
            for key in args[0].keys():
                if count is 0:
                    segment = ' '
                else:
                    segment = ','
                if isinstance(args[0][key],str):
                    val = ''.join(["'",args[0][key],"'"])
                else:
                    val = str(args[0][key])
                self.sql = ''.join([self.sql,segment,key,'=',val,' '])
                count = count+1
        '''
        combile where sql and where in sql
        '''        

        try:
            where_list = self.options['where']
        except:
            where_list = []
        else:
            if len(where_list):
                self.sql=''.join([self.sql,' where '])
            count=0
            for item in where_list:
                if count is 0:
                    segment = ' '
                else:
                    segment = ' AND '
                count=count+1
                if not item.get('type',False):
                    self.sql=''.join([self.sql,segment,item['key'],'=',str(item['val'])])
                elif item['type'] is 'in':
                    self.sql=''.join([self.sql,segment,item['key'],' in (',str(item['val']),') '])
                elif item['type'] is 'like':
                    self.sql=''.join([self.sql,segment,item['key'],' like %',str(item['val']),'% '])
        '''
        combile where sql and where in sql
        '''  
        rs = fetchone(self.sql)
        self.options = {}
        self.sql=''
        return rs
    #插入操作
    def insert(self,table=False,seg={}):
        
        if not isinstance(table,bool):
            self.sql=''.join(['insert into ',table,' '])
        else:
            return False
        if isinstance(seg,dict):
            count=0
            keystr=''
            valstr=''
            for key in seg.keys():
                if count is 0:
                    segment = ''
                else:
                    segment = ','
                keystr = ''.join([keystr,segment,key])
                if isinstance(seg[key],str):
                    val = ''.join(["'",seg[key],"'"])
                else:
                    val = str(seg[key])
                valstr = ''.join([valstr,segment,val]) 
        self.sql=''.join([self.sql,'(',keystr,')',' values ','(',valstr,')'])
        rs = fetchone(self.sql)
        self.options = {}
        self.sql=''
        return rs
    #删除操作
    def delete(self,table=False):
        
        if not isinstance(table,bool):
            self.sql=''.join(['delete from ',table,' '])
        else:
            return False
        '''
        combile where sql and where in sql
        '''        

        try:
            where_list = self.options['where']
        except:
            where_list = []
        else:
            if len(where_list):
                self.sql=''.join([self.sql,' where '])
            count=0
            for item in where_list:
                if count is 0:
                    segment = ' '
                else:
                    segment = ' AND '
                count=count+1
                if not item.get('type',False):
                    self.sql=''.join([self.sql,segment,item['key'],'=',str(item['val'])])
                elif item['type'] is 'in':
                    self.sql=''.join([self.sql,segment,item['key'],' in (',str(item['val']),') '])
                elif item['type'] is 'like':
                    self.sql=''.join([self.sql,segment,item['key'],' like %',str(item['val']),'% '])
        '''
        combile where sql and where in sql
        '''  
        rs = fetchone(self.sql)
        self.options = {}
        self.sql=''
        return rs
#测试
DB = Db_mysql()
DB.select('attr_id,attr_name').fm('hr_attribute').where('attr_type',0).where_in('attr_id','3,4,6').join('goods as g','g.id=a.id','left').order('attr_id').limit(3,5);
DB.get()

经测试,没有什么大问题,如果有问题建议请告诉我哦


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。