PythonPHPMySQL语句解析器解决业务分表
自己曾经做过一个网盘项目。刚开始由于需要快速地从0到1建设上线,所以没有对核心文档表进行分表。当然我的架构理念也是"按需架构设计"。产品需求在没有明确的长远计划的情况下以"小步快跑,赶超竞品"为主。后期由于产品功能触达目标用户群需求点、产品用户体验不断提升、产品多方位导流、加强产品推广文档表每天有百万数据增长量。不得不对文档表进行按用户id分表。当时产品功能已全覆盖文档的生命周期。产品功能已丰富多彩。修改所有关联文档表的业务代码为按用户id分表开发测试成本非常高。上线后线上问题不可控。经过考虑在业务代码最底层DB层进行SQL语句解析来进行用户id分表处理。这样的话开发测试成本都非常低。上线后有问题方便回滚和追查原因。
今天为大家介绍Python/PHP两种MySQL语句解析器。当时网盘项目用的是PHP编程语言开发。
Python的SQL语句解析器。个人推荐使用moz_sql_parser库。经调研官方的sqlparse库解析出来的语句段无法满足需求也很难理解。
1、Python moz_sql_parser库安装pip install moz_sql_parser
2、Python moz_sql_parser SQL语句解析from moz_sql_parser import parse import json #用例1 sql = "select id,name from t1 where id > 1" tree = parse(sql) print(json.dumps(tree)) 执行结果: { "select": [ { "value": "id" }, { "value": "name" } ], "from": "t1", "where": { "gt": [ "id", 1 ] } } #用例2 sql = "select id,name from t1 where id > 1 and id < 1" tree = parse(sql) print(json.dumps(tree)) 执行结果: { "select": [ { "value": "id" }, { "value": "name" } ], "from": "t1", "where": { "and": [ { "gt": [ "id", 1 ] }, { "lt": [ "id", 1 ] } ] } } #用例3 sql = "select id,name from t1 where id in (select id from t2 WHERE content = "xxxxxx")" tree = parse(sql) print(json.dumps(tree)) 执行结果: { "select": [ { "value": "id" }, { "value": "name" } ], "from": "t1", "where": { "in": [ "id", { "select": { "value": "id" }, "from": "t2", "where": { "eq": [ "content", { "literal": "xxxxxx" } ] } } ] } } #用例4 sql = "select t1.id, t1.name from t1 join t2 on t1.id = t2.id where t2.id > 1" tree = parse(sql) print(json.dumps(tree)) 执行结果: { "select": [ { "value": "t1.id" }, { "value": "t1.name" } ], "from": [ "t1", { "join": "t2", "on": { "eq": [ "t1.id", "t2.id" ] } } ], "where": { "gt": [ "t2.id", 1 ] } }
3、Python moz_sql_parser总结moz_sql_parser解析出来的结果符合SQL语法格式。 moz_sql_parser解析出来的结果适合业务分表的需求(可以取到SQL语句里的表名和WHERE条件) moz_sql_parser解析出来的结果代码二次开发复杂度低。
PHP的SQL语句解析器。个人推荐使用PhpMyAdmin的sql-parser组件。PhpMyAdmin是经过历史检验可信赖的。
1、PHP PhpMyAdmin/sql-parser安装composer require phpmyadmin/sql-parser
2、PHP PhpMyAdmin/sql-parser SQL语句解析<?php require_once "vendor/autoload.php"; use PhpMyAdminSqlParserParser; $query = "SELECT t1.id, t1.name FROM t1 LEFT JOIN t2 ON t1.id = t2.id WHERE t2.name = "xxxx""; $parser = new Parser($query); $stmt = $parser->statements[0]; var_dump($stmt); 执行结果: object(PhpMyAdminSqlParserStatementsSelectStatement)#46 (17) { ["expr"]=> array(2) { [0]=> object(PhpMyAdminSqlParserComponentsExpression)#48 (7) { ["database"]=> NULL ["table"]=> string(2) "t1" ["column"]=> string(2) "id" ["expr"]=> string(5) "t1.id" ["alias"]=> NULL ["function"]=> NULL ["subquery"]=> NULL } [1]=> object(PhpMyAdminSqlParserComponentsExpression)#49 (7) { ["database"]=> NULL ["table"]=> string(2) "t1" ["column"]=> string(4) "name" ["expr"]=> string(7) "t1.name" ["alias"]=> NULL ["function"]=> NULL ["subquery"]=> NULL } } ["from"]=> array(1) { [0]=> object(PhpMyAdminSqlParserComponentsExpression)#50 (7) { ["database"]=> NULL ["table"]=> string(2) "t1" ["column"]=> NULL ["expr"]=> string(2) "t1" ["alias"]=> NULL ["function"]=> NULL ["subquery"]=> NULL } } ["index_hints"]=> NULL ["partition"]=> NULL ["where"]=> array(1) { [0]=> object(PhpMyAdminSqlParserComponentsCondition)#54 (3) { ["identifiers"]=> array(3) { [0]=> string(2) "t2" [1]=> string(4) "name" [2]=> string(4) "xxxx" } ["isOperator"]=> bool(false) ["expr"]=> string(16) "t2.name = "xxxx"" } } ["group"]=> NULL ["having"]=> NULL ["order"]=> NULL ["limit"]=> NULL ["procedure"]=> NULL ["into"]=> NULL ["join"]=> array(1) { [0]=> object(PhpMyAdminSqlParserComponentsJoinKeyword)#51 (4) { ["type"]=> string(4) "LEFT" ["expr"]=> object(PhpMyAdminSqlParserComponentsExpression)#52 (7) { ["database"]=> NULL ["table"]=> string(2) "t2" ["column"]=> NULL ["expr"]=> string(2) "t2" ["alias"]=> NULL ["function"]=> NULL ["subquery"]=> NULL } ["on"]=> array(1) { [0]=> object(PhpMyAdminSqlParserComponentsCondition)#53 (3) { ["identifiers"]=> array(3) { [0]=> string(2) "t1" [1]=> string(2) "id" [2]=> string(2) "t2" } ["isOperator"]=> bool(false) ["expr"]=> string(13) "t1.id = t2.id" } } ["using"]=> NULL } } ["union"]=> array(0) { } ["end_options"]=> NULL ["options"]=> object(PhpMyAdminSqlParserComponentsOptionsArray)#47 (1) { ["options"]=> array(0) { } } ["first"]=> int(0) ["last"]=> int(39) }
3、PHP PhpMyAdmin/sql-parser总结PhpMyAdmin/sql-parser解析出来的结果是面向对象的类。类是根据SQL语法划分。 PhpMyAdmin/sql-parser解析出来的结果根据SQL语法来看类的话很清晰。 PhpMyAdmin/sql-parser解析出来的结果满足分表SQL语句解析需求。
大家有什么问题可以发评论沟通。
感谢大家的评论、点赞、分享、关注…
向日葵智能插线板P2上手评测远程控制电脑,触手可得之前笔者分享过一个向日葵开机插座,有网友体验后,又来询问笔者有没有那种排插类的智能插座,还别说向日葵家的智能产品还挺全的,除了智能插座之外,还有向日葵智能插线板P2,它同样可以实现
支付宝新出长辈模式,简洁无比支付宝设置里出现新的模式长辈模式!!!现在的支付宝已经不再是当初为了支付的单纯app。你可以在里面聊天转账购物点外卖打车和理财,甚至是看病买药,太多的功能也使得支付宝太过的复杂。对
长辈怎么快速掌握支付?一文教会老人玩转支付宝微信北京商报讯(记者岳品瑜刘四红)年轻人用手机,一顿操作猛如虎,但很多时候老年人用起来就很头疼了,一是有时字体太小,老人看得头昏眼花,也有可能功能复杂,经常让老人琢磨不透。如今,支付机
Android安装包要从APK变成AAB格式了?事情可能并非你想的那样玩过王者荣耀的朋友,几乎无人不晓鲁班七号这个英雄。作为Android的应用程序包,APK对于资深Android用户来说,知名度并不亚于前者。也正因如此,日前Google的一份声明,
高校如何打造智慧校园?高校的智慧校园建设基本思路如下1盘活数字校园建设成果通过数据治理体系,实现高校各项业务的数据标准化和规范化,为数据再利用提供基础。利用微服务架构数据中台等技术,实现高校业务的抽象和
vivo手机在国产手机中处于什么水平?手机的质量关乎着手机的使用体验以及手机使用的时长。在国产手机当中,vivo手机的质量是相当好的,在使用过vivo手机的用户之中对于vivo手机的质量都表示赞同。vivo手机的故障率
剪辑视频什么软件最好?个人觉得pr比较顺手本人算是一个剪辑爱好者平时喜欢剪动漫,所以在这里说一下我平时用的剪辑软件,首先要说下,不同的剪辑软件功能都大部分相同但也有小部分功能是不同的所以我们在下剪辑软件
中华v7怎么样?性价比高吗,值不值得购买?上市销售的汽车没有能不能买,只有性价比高与低是否合适买。中华V7这台车综合素质不差但是输在品牌和销量,作为家用车不应该是首选但是同样可以选择,先看这台车到底如何。中华V7,在售车型
郭富城的音响系统基础设施01hr基建之一氣刃。由于他的要求是要看到画面,而且是要充满能量的三维舞台,所以需要高音180度扩散,但扩散的同时不可以有rolloff。这个科技,并不是多只钻石高音放在一起便能做
飞机失事时,航空公司为什么宁肯赔几十亿,也不让乘客跳伞求生?首先大家需要明白一点,民航客机飞行高度一般都在一万米左右。这个高度不说跳伞,只说打开舱门都做不到,飞机内外气压差太大。退一步说,就算是打开舱门,气流都能给你直接吸出去,一万米高空还
2K高清大屏随身带,用LGgram随时享受好莱坞大片时间飞逝,不知不觉2021年已经过去了一半。忙碌了大半年,该放松时也需适当放慢脚步,是时候该奖励自己一场说走就走的旅行。背上行囊,带上一台相机和一台随时修图剪视频处理紧急事务的笔记
商业企业有销无进,是不是虚开发票?问题内容公司的采购和销售业务是真实的,有采购合同资金流向和物流单据,但公司在采购时无法取得发票(如沙子),销售时需要开具16专用发票,公司开具专票后按16去申报缴纳增值税,请问1)
企业所得税弥补亏损年限的4种情形,一文带你全看懂概述有想了解企业所得税弥补亏损年限的,今天给大家介绍一下哦!(此处已添加小程序,请到今日头条客户端查看)内容一适用企业所得税法的一般企业(一)享受主体所有行业。(二)结转年限5年。
国际物流巨头发布重磅黑科技,网友却不买单菜鸟早就有了当下的中国早已不是那个依靠一些廉价的劳动力而闻名世界的国家了。在很多领域上,咱们的技术不仅不比别人差,甚至早就稳稳的超越到了世界前列。数智化物流作为中国科技发展的新名片,里面蕴含的
取消21家高新技术企业资格,附高新技术企业认定相关问题及税收今日,涛哥看见许多高新技术企业资格被取消,不符合认定条件,获得的税收优惠要进行追缴!大家可能都知道高新技术企业有优惠,但是,具体什么优惠你知道吗?还有取消资格会受到什么惩罚?高新技
人社部延长社保缴费年限,只交15年领不了养老金?人社部公布人力资源和社会保障事业发展十四五规划,提到一个惊人的消息将逐步提高领取基本养老金最低缴费年限!本来我们只需要累计缴满15年社保,就可以享受养老金待遇,但是未来这个年限会在
差额发票出大事!涉及23亿!10月21日起,差额开票必须按这个来一公司因差额开票被查,涉案金额高达23亿,18人被抓!即日起,差额发票一定这样开,否则1hr差额发票被查!18人被抓!近日,青岛某管理公司因利用差额征税政策被查了,涉案金额高达23
IPO审计准备工作录制的时候麦克风出了点问题鼻音非常重(我又懒得重新录)anyway,第一次接触IPO的小朋友可以看看,算是自己的一点经验分享吧(此处已添加小程序,请到今日头条客户端查看)年审及常规
个人出租住房,要缴哪些税费?金九银十,当前正是住房租赁市场的交易旺季。国家税务总局湖南省税务局12366纳税服务热线数据显示,近期纳税人十分关注个人出租住房的涉税问题。咨询主要集中在个人出租住房需要缴纳哪些税
付款方和实际购买方不一致,发票应该开给谁?提问付款方和实际购买方不一致,发票应该开给谁?回复销售商品提供服务以及从事其他经营活动的单位和个人,对外发生经营业务收取款项,应按照时间业务由提供服务一方向接受服务一方开具发票。在
一般纳税人中的临时工,增值税怎么申报?(此处已添加小程序,请到今日头条客户端查看)有这么一类一般纳税人,就算是每期老老实实按时认证申报,他的进项税也不见得能当期就能抵扣。抵扣之前还必须得先取得一样东西。稽核比对结果通知
发票丢了怎么办?税局明确了!10月23日起,必须这么处理发票丢了,需要登报声明吗?用不用税务机关开具已报税证明单?会不会被罚?如何记账抵扣?壹2021发票丢失新规!一定要这么处理!发票丢了,会计不要光着急,先来学习一下最新的发票丢失政策