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

2020-08-04 14:20:09 +08:00
 lolizeppelin
抄的 openstack 的单元测试, 测试数据库相关测试都用 sqlite

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

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

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

烦死了,sqlalchemy 文档也看到头大
4795 次点击
所在节点    Python
32 条回复
chihiro2014
2020-08-05 02:03:16 +08:00
每家数据库的内部实现都不统一。你这测试和生产不统一,太秀了
roundgis
2020-08-05 02:15:49 +08:00
json 的操作不是 sql 标准的一部分

就算是 orm 框架支持也不会兼容全部的数据库
lolizeppelin
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
2020-08-05 10:41:52 +08:00
@lolizeppelin 我错了。膝盖给你。
wuwukai007
2020-08-05 10:45:58 +08:00
今天发布的 django3.1 支持所有所有 django 支持的数据库的 json 支持,
johnsona
2020-08-05 14:40:51 +08:00
那你就单独搞一个 mysql 做测试用的数据库,sqlite 文件数据库只是方便,只有一个文件或者是只是内存数据库,但不代表就一定要用这个啊
no1xsyzy
2020-08-05 15:12:43 +08:00
特定单元测试给个 pg,添句注释 “现在只能用 pg 单测,随时关注替换” 呗
lolizeppelin
2020-08-05 15:16:18 +08:00
@jsisjs20130824

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

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

然后发现自己傻逼了,几个数据库都自己玩自己的实现 orz
johnsona
2020-08-06 11:39:34 +08:00
@lolizeppelin mysql 的 json 都是后面版本才支持的,你以为呢。人挪活,树挪死,sqlite 没有 json 字段你怎么支持嘛。sqlite 作为单元测试只是减少运维工作量,不至于哪天单元测试用的数据库挂了,你 jenkins 构建跑不过。
但其实也不一定奸杀运维工作量,比如你用的是 flask,你完全可以在单元测试脚本里面,把配置的数据库连接的数据库改成其他数据库,例如 unit 而不是 develop,这样还是一台 mysql 服务器,但是单元测试一个库,其他的环境用其他的库,根本不会相互影响,我就不信你们只有本地和生产,没有测试环境的数据库。
johnsona
2020-08-06 11:41:31 +08:00
@lolizeppelin 那什么,突然发现自己昨天评论不太合适,还是好好评论,当作把自己知道的表达出来的一种途径吧
ghostviper
2020-09-04 09:39:30 +08:00
自己写 udf

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/695519

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX