范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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资源爆
低调德系老牌Magnat,全新的S500全景声客厅影院配置方案客厅影院的市场在这两年真的是被彻底点燃了。我常常会收到来自全国各地,包括香港澳门和台湾地区的影音集成商和工程商朋友们关于客厅影院音箱同类型品牌与产品的选择客厅组建杜比全景声系统时天领克03有颜值有性能,价格不贵品质出众,你还会买思域吗始于颜值,终于性能是很多人对领克03这款车的评价。领克这个年轻品牌成立不过四年,乍一听,让消费者不免有关于品牌力的担心,毕竟,新兴的年轻品牌如雨后春笋般疯长,又如夏日暴雨般来去匆匆最后的希望!中国男篮落选赛程公布,将于希腊加拿大同组竞技昨晚FIBA公布了2020年东京奥运会男篮落选赛的赛程,男篮进军奥赛的最后机会到了!男篮将于6月24日首战对阵加拿大,随后在6月25日背靠背对阵希腊,比赛地点在加拿大维多利亚。根据618必买的家居神器有哪些?看完这篇你就知道了每年的618活动,是厂家大促和消费者薅羊毛的绝佳机会。所以活动力度也是年中最大,让人忍不住买买买。那么你的购物车加满了吗?还有什么东西准备买但是还没有想好呢?你有你的选择,而我选择警惕身份信息被盗用!女子千万豪宅被离婚18年前夫变卖身份证信息十分重要。遇上坑人的老公,稍微不注意,千万豪宅就是别人的了。简直是防不胜防!金女士在婚前买下了北京的某些XX小区,当即就买下了其中一套三居室。拿到房子钥匙后,金女士置办好女子被离职中介骗200万意向金,谨防诈骗,人人有责骗子横行的时代,真是防不胜防。各种诈骗花样层出不穷,这不有消息称去年年底,江苏苏州的张女士联系中介徐某,想要购买一处房产。看房后张女士十分满意,在交了3笔共计200万意向金后,却迟杭州女子网约车跳车,司机却没有任何表示网约车出事已经不是第一次了,之前有跳车致死,也有跳车未遂的情况,但是无论哪一种,都给乘车人造成了不同程度的危害。6月12日,杭州的高女士打了一辆首汽约车,途中司机企图跟她搭讪,且两全球芯荒持续蔓延,芯片单价已飙涨5倍全球缺芯加剧,让涨价势在必行。买不到和买不起已成为不少下游企业共同面临的困境。某从业者告诉记者,他们使用的一款德国产芯片,去年的价格是3。5元,今年已经涨到16。5元了,一个芯片价董子健对每个摄像头告别,这奇奇怪怪的仪式感恰好是少年收官篇中,少年们自驾到了最后一个目的地,小董下车前跟车里每个机位都认真告别,还表示好不想这个节目结束啊想把车买走希望和少年们的下次相见可以很快到来呀!有没有被董子健的浪漫家庭摄像机如何增加安全性?三招教你检测针孔摄像头现在不管是住酒店还是在家里都让人不放心,就是因为平白无故多出一些偷窥的摄像机,所以掌握一些检测针孔摄像头的知识非常重要。查看酒店里可能藏匿摄像头的地方,比如机顶盒路由器水杯插座等利多部门集中治理摄像头偷窥等黑产,保护公民隐私安全势在必行今年5月以来,各级部门深入推进摄像头偷窥等黑产集中治理工作。看到这个消息真的是大快人心呢!市场监管总局深入推进摄像头偷窥等黑产集中治理工作,清理相关违规有害信息2。2万余条,处置平