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语句解析需求。
大家有什么问题可以发评论沟通。
感谢大家的评论、点赞、分享、关注…
手机夜景照片,敢不敢PK一下?回答了!现在由于手机拍摄功能越来越强大,拍摄夜景的功能日趋完善,在拍摄夜景时,可以选用的功能也比较多,比如,夜景模式,专业模式都可以进行夜间模式拍摄,拍出的效果也是比较理想的,特别
最近一些直播卖货明星为何送礼送苹果手机,而不是华为手机呢?前不久,陈赫直播间送苹果手机,被很多人骂上了热搜。很多人也会疑惑为啥明星们都不送华为手机呢?不是牛娃认为,主要原因有三个苹果手机还是硬通货作为手机生产史上的颠覆者,苹果在乔布斯的领
为什么那么多人反对玩手机?你好,我是丁大叔,很高兴回答你的问题。对于为什么那么多人反对玩手机这个问题,我认为,主要有以下几个方面的原因第一,手机是一种集通讯社会交往社会生活等功能于一体的工具,如果把手机仅仅
买红米的手机的人收入普遍都不高吗?不一定,我现在用着红米Note51399我也有10000苹果macbook还有10000相机车房也都有!可是那些用着七八千块手机的人也可能只有一部手机而已!只是想说明其实很多人对手
苹果新品成日更,一天发一个眼花缭乱3月20日晚,苹果发布第二代AirPods无线耳机,同时推出无线充电盒。AirPods第一代产品就颇受好评,作为目前旗下口碑最好的产品之一,新版还是做了一定的升级的。新款的AirP
苹果官网悄然更新或揭示新款iPhoneSE即将到来?手机中国新闻近几天,苹果官网的一连串动作着实给力,每晚都有无数人守在电脑手机前,翘首以盼新品的到来。无论是iMaciPadminiiPadAir还是昨日发布的全新一代AirPods
小米手环4曝光,支持蓝牙5。0,稳定性大幅提升如今智能穿戴设备可谓是发展迅速,好几年前都还只是在电影里出现的场景,现在却能真的实现在手表上打电话上网。而对于那些预算不太够但是又想体验智能穿戴设备的人来说,智能手环是一个不错的选
小米又曝性价比之王新机,这次有什么新亮点?我们如果有心对比前两年的小米,会发现它已经奋力追逐市场前列的对手们了,虽然大家都知道小米是主打性价比的手机品牌,但是这几年确实它的手机业务普普通通,没有生产很多吸引人眼球的新机,而
美媒现在谈禁用华为或太晚美中5G之战中国正在领先美媒称,美国和中国在欧洲开启5G之战,从欧洲对华为的使用程度来看,中国具有很多优势,正在领先。欧洲或是美中5G之战的主战场媒体3月20日报道,美国在敦促其世界各地的盟友出于网络安全
三星再被逼宫,EMEA市场华为暴涨70份额大幅逼近,小米进前五作者虎龙吟虽然三星在2018年保住了其在全球智能手机出货量第一的宝座,但在越来越多的市场,华为正在向三星发起猛攻。可以预见,2019年,将成为三星与华为全球智能手机老大争夺战的分水
6个点赞超高的资源网站让你10T资源爆满,告别资源匮乏!今天给大家分享6个资源网站,在这茫茫的网络中找资源,总是想要的资源找不到,没用的资源一大堆,偌大的百度资源严重告急。其实你也可以成为资源小达人,拥有这6款资源网站,让你10T资源爆