用python简单实现类似thinkphp的针对Mysql操作的数据模型
来源:互联网 发布:万能套打软件 编辑:程序博客网 时间:2024/05/29 17:49
摘自以前CI实现的商城系统,做APP时需要实现数据接口,便用python实现了。
假设有表tp_article
idtitletype1哈哈12图样涂森坡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 connectioncursor = 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()
经测试,没有什么大问题,如果有问题建议请告诉我哦
0 0
- 用python简单实现类似thinkphp的针对Mysql操作的数据模型
- python实现类似awk的简单功能
- thinkphp中类似java过滤器的实现
- 封装类似thinkphp连贯操作数据库的Db类(简单版)。
- 简单的thinkphp,mysql增删查改,连贯操作总结
- ThinkPHP之数据模型操作
- 针对类似淘宝商户注册时用模板生成自己商铺网页的操作
- MySQL的数据模型
- python 和mysql的简单操作
- Python针对目录操作的一点说明
- python之针对excel的操作
- Python针对图像的基础操作
- php编程,针对MYSQL的操作类
- 针对 C#+mysql数据模型+dataGridview 进行的 : 增加 删除 修改 查询 (狗血剧情)
- Struts 2实现类似ThinkPHP的MVC开发方式
- ThinkPHP学习笔记(一):ThinkPHP 框架的简单操作
- ThinkPHP学习简单的CURD操作
- ThinkPHP的简单CURD操作代码
- spring配置jndi数据源
- Nand flash基础概念
- NSString的几种常用方法
- CString转const char *
- qq邮箱订阅介绍
- 用python简单实现类似thinkphp的针对Mysql操作的数据模型
- 2014下半年---下
- eclipse code templates 设置(eclipse注释模版配置)
- java 学习笔记---集合Set
- 所以专门挑了些题干短的
- Android 开发环境搭建
- Python 中文转拼音
- 关于安装j2ee过程中出现不能找到运行环境的解决
- linux 查看二进制文件命令