推荐学习书目
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 · Aug 4, 2020 · 6041 views
    This topic created in 2101 days ago, the information mentioned may be changed or developed.
    抄的 openstack 的单元测试, 测试数据库相关测试都用 sqlite

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

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

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

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

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

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

    fuck !!!!
    yjhatfdu2
        6
    yjhatfdu2  
       Aug 4, 2020
    试试 ponyorm
    mahone3297
        7
    mahone3297  
       Aug 4, 2020
    线上用 pg,测试用 sqlite ?
    你能确保,你的测试,在测试环境过了,线上不出问题?虽然理论上,orm 封装了。。。
    coolyujiyu
        8
    coolyujiyu  
       Aug 4, 2020
    测试的环境和线上不一致?作死?
    arischow
        9
    arischow  
       Aug 4, 2020
    环境不统一这不科学
    janxin
        10
    janxin  
       Aug 4, 2020
    不是应该环境一致么...

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

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

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

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

    就默认 sql 语句一定能正常工作好了
    wangkun025
        20
    wangkun025  
       Aug 4, 2020
    测试和生产不用同一种数据库,谁给你的勇气?
    chihiro2014
        21
    chihiro2014  
       Aug 5, 2020
    每家数据库的内部实现都不统一。你这测试和生产不统一,太秀了
    roundgis
        22
    roundgis  
       Aug 5, 2020
    json 的操作不是 sql 标准的一部分

    就算是 orm 框架支持也不会兼容全部的数据库
    lolizeppelin
        23
    lolizeppelin  
    OP
       Aug 5, 2020
    @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  
       Aug 5, 2020
    @lolizeppelin 我错了。膝盖给你。
    wuwukai007
        25
    wuwukai007  
       Aug 5, 2020 via Android
    今天发布的 django3.1 支持所有所有 django 支持的数据库的 json 支持,
    johnsona
        26
    johnsona  
       Aug 5, 2020
    那你就单独搞一个 mysql 做测试用的数据库,sqlite 文件数据库只是方便,只有一个文件或者是只是内存数据库,但不代表就一定要用这个啊
    no1xsyzy
        27
    no1xsyzy  
       Aug 5, 2020
    特定单元测试给个 pg,添句注释 “现在只能用 pg 单测,随时关注替换” 呗
    lolizeppelin
        28
    lolizeppelin  
    OP
       Aug 5, 2020
    @jsisjs20130824

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

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

    然后发现自己傻逼了,几个数据库都自己玩自己的实现 orz
    johnsona
        30
    johnsona  
       Aug 6, 2020
    @lolizeppelin mysql 的 json 都是后面版本才支持的,你以为呢。人挪活,树挪死,sqlite 没有 json 字段你怎么支持嘛。sqlite 作为单元测试只是减少运维工作量,不至于哪天单元测试用的数据库挂了,你 jenkins 构建跑不过。
    但其实也不一定奸杀运维工作量,比如你用的是 flask,你完全可以在单元测试脚本里面,把配置的数据库连接的数据库改成其他数据库,例如 unit 而不是 develop,这样还是一台 mysql 服务器,但是单元测试一个库,其他的环境用其他的库,根本不会相互影响,我就不信你们只有本地和生产,没有测试环境的数据库。
    johnsona
        31
    johnsona  
       Aug 6, 2020
    @lolizeppelin 那什么,突然发现自己昨天评论不太合适,还是好好评论,当作把自己知道的表达出来的一种途径吧
    ghostviper
        32
    ghostviper  
       Sep 4, 2020
    自己写 udf
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5467 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 124ms · UTC 09:30 · PVG 17:30 · LAX 02:30 · JFK 05:30
    ♥ Do have faith in what you're doing.