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 · 5087 次点击
    这是一个创建于 1601 天前的主题,其中的信息可能已经有所发展或是发生改变。
    抄的 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
    不是应该环境一致么...

    万一踩到引擎不一致的坑怎么办?
    thonatos
        11
    thonatos  
       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   ·   实用小工具   ·   850 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:54 · PVG 04:54 · LAX 12:54 · JFK 15:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.