被各种关系数据库的 json 操作坑死了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lolizeppelin
V2EX    Python

被各种关系数据库的 json 操作坑死了

  •  
  •   lolizeppelin 2020-08-04 14:20:09 +08:00 5596 次点击
    这是一个创建于 1897 天前的主题,其中的信息可能已经有所发展或是发生改变。
    抄的 openstack 的单元测试, 测试数据库相关测试都用 sqlite

    平时单元测试都没什么问题,这两天处理 json 字段的查询的时候搞死人了
    兼容 mysql 还好点....兼容 sqlit 简直要死,看了半天最后翻 sqlite 文档发现 sqlite 的 json 没有 contains 方法
    需要用 json_each 生成的临时表来过滤。。。。

    orm 里没法弄了,array 这个玩意又只有 pg 支持

    sqlite 单元测试太好用了点,妈的不会真要单元测试也连个 pg 吧 orz
    但是 sqlite 又没法测 json

    烦死了,sqlalchemy 文档也看到头大
    32 条回复    2020-09-04 09:39:30 +08:00
    virusdefender
        1
    virusdefender  
       2020-08-04 14:57:24 +08:00
    docker run 一个 pg 不很简单么
    johnsona
        2
    johnsona  
       2020-08-04 15:00:44 +08:00
    这告诉我们不要在 rdbms 用 json,老老实实关联
    lolizeppelin
        3
    lolizeppelin  
    OP
       2020-08-04 15:13:54 +08:00
    @virusdefender

    不是简单不简单的问题, 单元测试会不停的创建销毁,这种情况 sqlite 是最方便的
    love
        4
    love  
       2020-08-04 15:14:53 +08:00
    什么场景要在关系数据库时用 json 呢?
    lolizeppelin
        5
    lolizeppelin  
    OP
       2020-08-04 15:16:02 +08:00
    @jsisjs20130824
    简单的 array 还是很方便的啊,本机 ip 列表,hostname 之类的真是方便啊,

    但是! 数据库支持都不统一呀............

    fuck !!!!
    yjhatfdu2
        6
    yjhatfdu2  
       2020-08-04 16:02:13 +08:00
    试试 ponyorm
    mahone3297
        7
    mahone3297  
       2020-08-04 16:06:28 +08:00
    线上用 pg,测试用 sqlite ?
    你能确保,你的测试,在测试环境过了,线上不出问题?虽然理论上,orm 封装了。。。
    coolyujiyu
        8
    coolyujiyu  
       2020-08-04 16:49:34 +08:00
    测试的环境和线上不一致?作死?
    arischow
        9
    arischow  
       2020-08-04 16:53:29 +08:00
    环境不统一这不科学
    janxin
        10
    janxin  
       2020-08-04 16:54:55 +08:00
    不是应该环境一致么...

    万一踩到引擎不一致的坑怎么办?
    SuYia
        11
    SuYia  
       2020-08-04 16:55:53 +08:00
    显然,是被自己坑死的,和数据库没关系
    Vegetable
        12
    Vegetable  
       2020-08-04 17:02:23 +08:00
    sqlite 和 mysql 、pg 还是有一定区别的,一旦用到了其他数据库的特性,都没办法在 sqlite 上测试了吧,比如 DjangoOrm 有一些 pg 特有的特性,sqlite 还有个什么操作不支持,有点记不清了,遇到过一次。
    cco
        13
    cco  
       2020-08-04 17:05:34 +08:00
    目前只用过 mysql 的 json 。。。。pg 想用没有需求
    mxT52CRuqR6o5
        14
    mxT52CRuqR6o5  
       2020-08-04 17:18:45 +08:00 via Android
    @lolizeppelin 测试的目的是尽可能模拟真实环境找出问题,而不是为了方便开发
    你对测试的理解就有问题
    lyhiving
        15
    lyhiving  
       2020-08-04 17:25:42 +08:00
    关联 JSON 是不对的,JSON 在数据库里面只是为了储存方便。
    johnsona
        16
    johnsona  
       2020-08-04 18:40:26 +08:00
    @lolizeppelin 废话,pg 和 mysql 对 json 的支持能统一吗,你老老实实用 orm,会帮你把关联表转化成 array 好吧,别乱用,你抄 openstack 单元测试的时候,怎么不抄人家的表结构设计呢
    Sunkz
        17
    Sunkz  
       2020-08-04 18:42:54 +08:00
    我最近搞 postgis 快被坑死了
    chinvo
        18
    chinvo  
       2020-08-04 18:47:41 +08:00
    efcore 的 sqlite 官方 驱动对有些查询的表现就和其他数据库的驱动不一致

    既然是单元测试, 目的就是保障线上运行正常, 为什么不和线上环境保持一致

    嫌单元测试实例销毁频繁也没办法, 你可以看看各种流行开源项目, CI 的时间基本都是消耗在 setup 阶段
    chinvo
        19
    chinvo  
       2020-08-04 18:48:18 +08:00
    实在不行就 mock 吧

    不实际操作数据库, 全都 mock sql 语句

    就默认 sql 语句一定能正常工作好了
    wangkun025
        20
    wangkun025  
       2020-08-04 18:51:16 +08:00
    测试和生产不用同一种数据库,谁给你的勇气?
    chihiro2014
        21
    chihiro2014  
       2020-08-05 02:03:16 +08:00
    每家数据库的内部实现都不统一。你这测试和生产不统一,太秀了
    roundgis
        22
    roundgis  
       2020-08-05 02:15:49 +08:00
    json 的操作不是 sql 标准的一部分

    就算是 orm 框架支持也不会兼容全部的数据库
    lolizeppelin
        23
    lolizeppelin  
    OP
       2020-08-05 09:55:10 +08:00
    @mahone3297
    @coolyujiyu
    @arischow
    @mxT52CRuqR6o5
    @wangkun025
    @chihiro2014

    openstack 单元测试所有数据库都是 sqlite,集成测试才会用到 mysql
    海量单元测试用 mysql 才是不现实的,时间过长

    如果你们觉得 openstack 的这类开发了整套测试框架的大型项目用 sqlite 测试不合理,那可能你水平比我好很多,因为我大部分都是 openstack 里学来的,也希望你能介绍个更好的 项目 /经验

    openstack 里没有使用 json 字段,json 内容都是文本存储
    因此单元测试不需要解决 json 问题(所以我没得抄),但是也因此 openstack 没法在数据库层过滤 json 内容需要去业务层做,我自己加 json 发现坑在了单元测试上,mysql 都还好解决

    @jsisjs20130824
    openstack 的表设计我还是很熟的
    这个 array 是 json 的 array,不是关联表,pg 从 json 中独立了出了一个 array 类,看 sqlalchemy 文档里说这个玩意进入标准 sql 了但 sqlalchemy 目前之支持 pg

    这个字段用来存储 服务器 ip,vhost 的 domain name 非常好用,需要外网 ip 的就过滤外网字段长度>0,
    需要 domain 就 any 字段 domain name, 比做关联表好用多了
    wangkun025
        24
    wangkun025  
       2020-08-05 10:41:52 +08:00
    @lolizeppelin 我错了。膝盖给你。
    wuwukai007
        25
    wuwukai007  
       2020-08-05 10:45:58 +08:00 via Android
    今天发布的 django3.1 支持所有所有 django 支持的数据库的 json 支持,
    johnsona
        26
    johnsona  
       2020-08-05 14:40:51 +08:00
    那你就单独搞一个 mysql 做测试用的数据库,sqlite 文件数据库只是方便,只有一个文件或者是只是内存数据库,但不代表就一定要用这个啊
    no1xsyzy
        27
    no1xsyzy  
       2020-08-05 15:12:43 +08:00
    特定单元测试给个 pg,添句注释 “现在只能用 pg 单测,随时关注替换” 呗
    lolizeppelin
        28
    lolizeppelin  
    OP
       2020-08-05 15:16:18 +08:00
    @jsisjs20130824

    不就是昨天脑残想写点兼容代码让 sqlite 的 json 也能用呗

    发现没法解决,所以 pg json 特性的表做单元测试都老老实实走 pg 呗
    lolizeppelin
        29
    lolizeppelin  
    OP
       2020-08-05 15:20:54 +08:00
    @no1xsyzy
    是我天真自大的以为可以通过兼容写法兼容掉

    然后发现自己傻逼了,几个数据库都自己玩自己的实现 orz
    johnsona
        30
    johnsona  
       2020-08-06 11:39:34 +08:00
    @lolizeppelin mysql 的 json 都是后面版本才支持的,你以为呢。人挪活,树挪死,sqlite 没有 json 字段你怎么支持嘛。sqlite 作为单元测试只是减少运维工作量,不至于哪天单元测试用的数据库挂了,你 jenkins 构建跑不过。
    但其实也不一定奸杀运维工作量,比如你用的是 flask,你完全可以在单元测试脚本里面,把配置的数据库连接的数据库改成其他数据库,例如 unit 而不是 develop,这样还是一台 mysql 服务器,但是单元测试一个库,其他的环境用其他的库,根本不会相互影响,我就不信你们只有本地和生产,没有测试环境的数据库。
    johnsona
        31
    johnsona  
       2020-08-06 11:41:31 +08:00
    @lolizeppelin 那什么,突然发现自己昨天评论不太合适,还是好好评论,当作把自己知道的表达出来的一种途径吧
    ghostviper
        32
    ghostviper  
       2020-09-04 09:39:30 +08:00
    自己写 udf
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3503 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 10:39 PVG 18:39 LAX 03:39 JFK 06:39
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86