Package: a-sqlbuilder
前言Python开发的mysql链式操作，ABuilder告别繁琐的模型定义，节省开发时间，几乎没有任何要求，导入直接使用。与常规模型不同ABuilder不需要预先定义表字段、字段类型、字段长度等繁琐的设置，当然那样做有它的优点这里就不说了～，各具所长取舍看个人。ABuilder支持入直接使用，简单、快速、便捷快速开始安装 a-sqlbuilderpip3installa-sqlbuilder设置数据配置文件（参照数据库配置文件说明）开始使用fromABuilder.ABuilderimportABuildermodel=ABuilder()data=model.table('tar_user').field("username,id").where({"username":["like","%M-萌%"]}).limit(0,1).query()使用文档第三方库要求pymysqllogging数据库配置文件我们需要开发者在项目更目录中加入database.py数据库配置文件确保from database import database能获取到数据库配置项配置文件实例:classConfig(object):passclassProconfig(Config):passclassDevconfig(Config):debug=TrueDATABASE_URI='mysql+pymysql://root:root@127.0.0.1:3306/target'data_host='127.0.0.1'data_pass='root'data_user='root'database='target'data_port=3306charset='utf8mb4'database=Devconfig支持函数目前项目只支持一些简单用法具体如下table 查询表where where条件where_or 设置or条件field 查询字段limit 查询条数group 分组order 排序join 连表查询first 查询单条query 查询多条pluck 查询单个字段insert 插入update 修改delete 删除select 执行原生查询commit 事物提交rollback 事物回滚get_last_sql 获取执行sqlget_insert_id 获取插入idtable设置查询表fromABuilder.ABuilderimportABuilderdata=ABuilder().table('user').limit(0,1).query()print(data)where设置where条件fromAmo.ABuilderimportABuilderABuilder().table('user').where({"id":["=",3]}).first()多个where条件ABuilder().table('user').where({"id":['<=',10],"sex":["=","男"]}).query()# 或则多个where拼接ABuilder().table('user').where({"id":['<=',10]}).where({"sex":["=","男"]}).query()比较符号支持=,<>,<,>,<=,>=,in,like等where_or设置or条件where_or使用方法与where大同小异fromAmo.ABuilderimportABuilderABuilder().table('user').where_or({"id":["=",3]}).query()比较符号支持=,<>,<,>,<=,>=,in,like等field设置查询字段ABuilder().table("user").field("user_id,sex,user_name").query()# 举例count使用ABuilder().table("user").field("count(*) as count").query()不设置field默认查询全部字段*,查询字段使用,隔开,支持count(),sum()等注意：不支持类似DATE_FORMAT(NOW(),'%m-%d-%Y')这类带有%的函数limit查询数ABuilder().table("user").limit(0,10).query()limit第一个参数为开始查询位置，第二个参数为获取多少条group分组# 按照性别分组ABuilder().table("user").field("count(*) as count").group('sex').query()# 多个分组使用ABuilder().table("user").field("count(*) as count").group('sex').group('age').query()# sql为：select count(*) as count from user group by sex,ageorder排序ABuilder().table("user").order("user_id","desc").query()# 多个排序值ABuilder().table("user").order("user_id","desc").order("sex",'asc').query()# sql为：select * from tar_user order by user_id desc,sex ascorder by先后顺序：遵循从左到右join连表查ABuilder().table('user as u').field('u.id,b.name').join('book b','u.id=b.user_id','INNER').where({"u.id":['=',1]}).query()# sql为：select u.id,b.name from user as u INNER JOIN book b on u.id=b.user_id where u.id = 1join三个参数说明表名列表条件 支持and,orjoin类型：INNER,LEFT,RIGHT,FULL默认INNER支持多个连表，拼接多个join即可。例如:table('table as t').join('table1 t1','t1.user_id=t.id').join('table2 t2','t1.id=t2.book_id')first查询单条记录find=ABuilder().table('user').where({"id":["=",3]}).first()print(find)query查询多条记录data=ABuilder().table('user').where({"id":["in",(1,2,3,4)]}).query()print(data)pluck查询单个字段user_id=ABuilder().table('user').where({"username":["=",'张三']}).pluck('id')print(user_id)insert插入数据model=ABuilder()state=model.table("user").insert({"username":"张三","sex":'男',"age":18})ifstate:print("添加成功！自增id：%"%model.get_insert_id)else:print("添加失败")update修改记录state=ABuilder().table("user").where({"username":["=","张三"]}).update({"age":25})ifstate:print('修改成功')else:print('修改失败')delete删除记录state=ABuilder().table("user").where({"username":["=","张三"]}).delete()ifstate:print('删除成功')else:print('删除失败')select执行原生sqlmodel=ABuilder()# 第一种方式model.select("SELECT username,id FROM user where id=%s",[1])# 第二种方式model.select("SELECT username,id FROM user where id=1")commit，rollback事物操作model=ABuilder()state=model.table("user").insert({"username":"张三","sex":'男',"age":18})ifstate:state=model.table("book").insert({"book_name":'书本昵称',"user_id":model.get_insert_id})ifstate:# 成功则提交事物model.commit()else:# 失败则回滚事物model.rollback()操作事物注意事项：请勿实例多个ABuilder否则一部分事物在回滚操作时回滚失败deffun1():model=ABuilder()state=model.table("user").insert({"username":"张三","sex":'男',"age":18})ifstate:state=fun2()ifstate:model.commit()else:model.rollback()deffun2():model=ABuilder()returnmodel.table("book").insert({"book_name":'书本昵称',"user_id":model.get_insert_id})fun1()这样如果fun2()返回失败的是失败状态回滚的只是fun1()执行的sql却无法回滚fun2()执行的sql，正确做法如下：deffun1():model=ABuilder()state=model.table("user").insert({"username":"张三","sex":'男',"age":18})ifstate:state=fun2(model)ifstate:model.commit()else:model.rollback()deffun2(model):returnmodel.table("book").insert({"book_name":'书本昵称',"user_id":model.get_insert_id})fun1()get_last_sql获取最后一条执行sqlmodel=ABuilder()find=model.table('user').where({"id":["=",3]}).first()print(model.get_last_sql)获取sql注意事项：输出的sql对于字符串没有加上引号，导致拷贝到数据库管理工具里无法执行，处理办法：给予字符串加上单引号或双引号即可，后面维护会优化（抱歉）get_insert_id获取插入自增idmodel=ABuilder()model.table("user").insert({"username":"张三","sex":'男',"age":18})print(model.get_insert_id)class继承方式使用示例fromABuilder.ABuilderimportABuilderclassUserModel(ABuilder):def__init__(self):self.table_name='user'defuser_info(self,user_id):info=self.table(self.table_name).field("user_id,user_name").where({"user_id":user_id}).first()print(self.get_last_sql)returninfodeflogin(self):passuserInfo=UserModel().user_info(user_id=1)print(userInfo)案例项目目标记账+记账+。记账与目标结合，随时随地记录每一笔交易，人情来往，多人记账，每日记账实时统计与目标距离，即时了解资金概况资金流向感谢项目初期是非常第一个简单版本，如有问题，写法不规范的欢迎反馈，千言万语，你懂的，我就不说了