推荐学习书目
› 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 · 6603 views
    This topic created in 2284 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
    virusdefender
    Aug 4, 2020
    1
    docker run 一个 pg 不很简单么
    johnsona
    johnsona
    Aug 4, 2020
    2
    这告诉我们不要在 rdbms 用 json,老老实实关联
    lolizeppelin
    lolizeppelin
    OP
    Aug 4, 2020
    3
    @virusdefender

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

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

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

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

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

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

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

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

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

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

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

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