V2EX POST
641 subscribers
138 photos
31 videos
99 files
102K links
v2ex新贴定时推送,可按需置顶本频道然后关闭通知
Download Telegram
项目中的专用调试器如何实现?分享一些来自项目中的思考

## 背景

在数据开发场景中,为了增强可维护性,我们增强了 SQL 的语法,定义了一个简单的开发语言。但是这带来了额外的使用成本。本文讨论了如何支持增强 SQL 的代码编辑和调试,以应对日常的开发工作。

## 内容:

调试器包含主要内容:

- 执行某一步骤,实现暂停、继续等流程控制功能
- 查看或设置执行过程中的变量
- 在断点过程中执行 sql
- 查询执行状态
- 查询执行步骤信息

![Usage]( https://raw.githubusercontent.com/easysql/easy_sql/main/debugger-usage.gif)

全文阅读,请移步: https://brightliao.com/2021/04/10/data-development-tools/

#执行 ### #SQL #sql #https #com #增强 #开发 #查询 #步骤
为什么我们不用 git 当数据库呢?

一行 sql 也没写过不知道为啥要用这玩意
blob tree grep awk 各种 pipe 倒是一点不怵
我感受不到任何 crud 比 git 更好用的(个人感受
github 就是拿 git 当数据库的, 对吧?(摆事实

#git #感受 #摆事实 #sql #blob #tree #grep #awk #pipe #不怵
兄弟们,关于 sql 优化的问题想请教一下

最近学习了一下 sql 语句的优化入门,这里有个场景存在疑惑:
比如一个简单的查询,比如
select a,b,c,d from table order by d desc limit 0,100;
在 d 字段上创建普通索引,另外由于 b 字段可能会保存很大的数据,所以我认为创建联合索引(a,b,c,d)进行索引覆盖查询可能不好?问题如下:
1.这个查询属于 filesort ,效率不高,在表数据量不大的时候不会暴露问题,但是在数据量大的时候,时间就长了,这个场景下改如何优化呢?
2.我目前只知道强制使用 d 索引,或者创建我上面说的联合索引进行索引覆盖外,还有没有别的方法呢,另外,当一个字段保存的数据较多时,有必要创建联合索引吗,好像重复了上面的疑问。。求解。。

#索引 #创建 #数据量 #查询 #联合 #场景 #优化 #覆盖 #保存 #sql
[数据库内核方向开发职位] [北、上、杭、深、广、西、成、remote 等] [30K~70K]

[内核开发] : 存储层(索引、事务、文件系统、高可用、容灾备份等)。SQL 层( SQL 引擎、执行器、优化器、内存计算等); [工具生态开发] [管控开发] :要求数据库存储相关业务背景(其他业务后端暂不接受);

[产品类型] :OLTP 、OLTAP 、HTAP

[招聘公司] :头部云厂商、国企、强业务属性公司、数据库创业公司等。

前程序猿懂一丢丢数据库方向技术的小猎头。 欢迎加微信聊聊天儿,认识一下~
vx:Z2VsYWl3YW5n(base64) 请备注 v2 ,说明来意,谢谢哈。

重新发一下,上次有朋友说:没说薪资范围,能给到 30K 起的薪资,不设上限~

欢迎同行可以交流,但希望别冒充求职人选,挺丢人的~~~

#数据库 #SQL #薪资 #开发 #存储 #业务 #欢迎 #执行器 #容灾 #OLTP
请问如何通过 Python3 向 MySQL 写入 JSON 数据

软件版本:
Python 3.10
MySQL 8.0

Python3 字典
v = {['v' : 'v']}

转换为 json 字符串
vv = json.dumps(v)

构造 sql 语句
sql = "INSERT INTO table_name (column_name) VALUES (%s)" % (vv)
写入 MySQL
db.query(sql)

报错信息:
"pymysql.err.ProgrammingError: (1064, 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'p1": [.................."
我理解应该是 json 数据没有没有转义造成的。
于是尝试
vv = ‘"""’ + vv ‘"""’
报同样的错误。

请问各位大佬有什么解决办法能直接将 json 数据写入 MySQL 吗?

#MySQL #json #vv #sql #name #your #syntax #写入 #报错 #Python
如何学习 mysql 原理?

每次面试都被问什么 sql 优化,什么 in 和 exists 区别,count 怎么查快,一般都是背结论,有没有什么原理性的书或者文档去解释这内部的原理呢,求推荐

#原理 #sql #exists #count #查快 #什么 #文档 #面试 #结论 #优化
不懂就问,你们都是如何维护更新脚本的

### 背景

公司的业务环境分为:开发,测试,生产;但是每次需求上线发布可能需要整理一大堆配置脚本啥的,比如 sql 脚本,nacos 配置修改等等

### 目前情况

目前用的钉钉文档维护,但是钉钉文档很难用,每次更新会容易漏掉某个脚本,或者粗心忘记更新某个脚本,导致更新扣掉

请问各位大咖,贵司都是如何维护这些升级的配置或者脚本的呢

#脚本 #### #文档 #更新 #配置 #某个 #每次 #维护 #sql #nacos
团队自己写了个 ETL 自动化测试框架,给关注自动化测试或数据测试的同学们做参考

在基于 ETL 的数据开发中,如何构建一个 ETL 自动化测试框架?

我们利用 Excel 电子表格,构建了一个轻量级的框架。它可以方便的支持测试用例编写和运行,能有效提高团队工作效率。

一个测试用例定义如下:

![定义测试]( https://brightliao.com/attaches/2021/2021-04-25-data-testing-tool/case-input-annotation.png)

不过,ETL 测试框架虽然好用,但还需谨慎对待构建测试这件事,因为过多的测试可能会带来过高的维护成本。

有感兴趣的同学欢迎移步[这里]( https://brightliao.com/2021/04/25/data-testing-tool/)了解详情。

此测试框架已开源,项目地址为: https://github.com/easysql/easy_sql

测试相关功能介绍: https://easy-sql.readthedocs.io/en/latest/easy_sql/testing.html

#测试 #https #ETL #com #2021 #testing #easy #sql #框架 #测试用例
withtyped: 写原生 SQL 即可拥有强类型 API 和客户端,数据库初始化工具,以及动态 OpenAPI 接口

新框架新概念层出不穷,业务总逃不过 CRUD 。与其加一层又一层抽象,或者是生成再同步代码,是不是可以换一个角度,直接处理数据库定义、前后端、和 API 文档之间的同步问题?

在解决完前后端的类型同步问题以后,结合最近的项目实践,我想干脆更进一步:

在 TypeScript 里写 SQL ,然后即可得到四个东西:

1. 数据库初始化工具
2. RESTful API 服务( CRUD API 开箱即用,深度定制也没问题)
3. 类型安全的 JS 客户端(基于 fetch ,并且能自动推导所有 API 的入参和出参)
4. 动态生成的 OpenAPI 接口

没有代码生成,没有同步时间 - 改一改 SQL ,上述四项就会同步变化,让 VSCode 的 IntelliSense 为你工作就行。

所有组件都是解耦的,比如可以只用路由和客户端,服务器用 Koa/Express/Next 应该都没问题。

字有点多,来张图吧:

![Banner]( https://s2.loli.net/2022/12/07/a7yve3BhlouN6K1.png)

⬇️ 项目地址

https://github.com/withtyped/withtyped

自己试了试感觉开发效率有所提升,欢迎大家拍砖讨论

#API #同步 #CRUD #SQL #https #withtyped #客户端 #数据库 #问题 #生成
请教 Springboot 接口 RPS 优化问题

目前的部署环境如下:

服务:jdk11 +springboot2.5
JVM 默认配置

阿里云 ECS 4c 16G * 2 + SLB 做负载均衡
RDS MySQL5.7 2c 8G 单机
Redis 主要做分布式锁

目前测试下来,TPS avg 500+,峰值 900+,业务异常大主要是 tryLock 没获取到锁直接 return 了。

领导说这配置理论应该能处理 5000 ,峰值可以到 8000 ?之前冷系统做的多,不太清楚,这个配置可以能到什么量级,虚心求教。sql 基本已做优化,没啥慢 sql 了。

请问下还有什么优化的方式吗?

[![zc04at.png]( https://s1.ax1x.com/2022/12/07/zc04at.png)]( https://imgse.com/i/zc04at)

#zc04at #sql #png #https #com #配置 #峰值 #优化 #jdk11 #springboot2.5
总感觉数据库 SQL 语法解析的报错信息都很鸡肋

近一年高强度使用 MySQL 和 Clikhouse ,手撸 sql 出错后进行排查,数据库提供的语法错误信息总是很迷惑。

相比较其他编程语言编译期的报错信息就很准确。

在 user-friendly 这块,是不是各家数据库提升的空间还很大。

#数据库 #报错 #语法错误 #MySQL #Clikhouse #sql #user #friendly #编程语言 #信息
Python 调用 mysql 能否一次执行多条语句

现有一文件,其中存储大量 sql 语句,操作多个表,需要 python 读取并执行。

使用 mysqlclient 库,似乎只能一次执行一条语句,执行 100 条语句需要 100 次网络通信;

如果将语句用分号连接,调用 cursor.execute 会报:

MySQLdb._exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")

cursor.executemany 方法只能对同一个表进行插入,不适用多表的情形。并且查看 executemany 的源码发现也是逐条请求的。

请问,一次网络请求执行多条 sql 语句,能否实现?

#语句 #sql #100 #cursor #executemany #执行 #请求 #多表 #源码 #python
后端开发工程师(远程工作岗位+海外本地生活业务)

工作职责:
- 负责后端业务分析、系统设计及优化,功能开发、把各类复杂业务拆解并实现;
- 理解业务需求,负责业务项目的分析拆解、架构设计、抽象实现、以及质量把控;
- 持续优化服务性能,优化服务架构,提升系统稳定性;
基本要求:
- 3 年以上后端开发经验;
- 熟练掌握 Java/PHP/Go 之一(Java 优先)开发语言及相关框架和开源库;
- 对基础数据结构与算法了解,熟悉常用设计模式,善于抽象、分析、归纳
- 熟悉 SQL 语法,对数据库的原理了解,具备常用的 SQL 优化能力,了解 NoSQL 及使用场景;
- 熟悉 HTTP 协议、缓存、线程模型、多线程编程等;
- 了解区块链及基础应用
- 主动积极,认真负责,良好的团队协作精神;
- 大并发背景开发者优先;
- 有区块链业务背景开发者优先;
- 本地生活应用背景开发者优先。

收入:
- 每月基础底薪:2w-4w ;
- 每月项目提成

产品类型:
- 海外美团、海外租房类型 app

面试:
- 联系邮箱: mengmeng77renshi@gmail.com

#开发者 #优先 #优化 #业务 #Java #SQL #区块 #了解 #拆解 #熟悉
springboot+mybatis 查询 oracle 无响应,直接执行 sql 正常返回结果

最近生产上碰到这么一个问题,百思不得其解。

一张表数据量大了,就做了按月分区。具体做法是先重命名旧表,然后新建分区表,后从旧表往新表导数据。

刚开始没注意,后面就发现,程序提交的```SELECT COUNT(*)```语句就是查不到结果,一直无响应最后接口请求超时,这个 SELECT 语句关联了三张表,包含上面新建的分区表。

奇怪的是,从日志中将 sql 拎出来直接执行,又能得到结果。但是从程序日志里看这个 sql 就是一直没有查到结果。

通过查询 V$SESSION 、V$SQL 等表,发现程序提交的 sql 都处在 ACTIVE 状态,事件类型是```'latch:cache buffers chains```,把会话杀掉也试过,还是不行,依旧是程序发起的查询无响应,直接执行 sql 就可以。

后来问公司 DBA ,他让执行下 ```analyze table 表名 compute statistics```,几张关联表都执行了下,后面就正常了。

这是什么原理?有懂的大神帮忙解答下吗?

#sql #分区表 #程序 #旧表 #SELECT #执行 #日志 #语句 #查询 #提交
Liquibase 使用姿势求教

想通过 Liquibase 维护各个开发机 local 环境数据库结构的一致性,分别尝试了 maven plugin 和添加到 dependency 的方法。

不同工具 update 之后的 `DATABASECHANGELOG.FILENAME` 是不同的,比如用 `mvn liquibase:update` 得到 `src/main/resources/db/changelog/changelog.sql`。

启动 Spring Boot 程序的时候 Liquibase 读到的 changelog 文件路径是 `classpath:db/changelog/changelog.sql`,这两个路径差异会导致 `liquibase.changelog.filter.ShouldRunChangeSetFilter#changeSetsMatch` 方法返回 False ,让 Liquibase 认为这个 changeset 没有应用过,试图执行 SQL 语句创建表然后失败。

想问下一般生产实践都是怎么做的?禁止不同方法混用?

maven plugin 和 dependency 的版本都是 4.17.2 。

#changelog #Liquibase #maven #plugin #dependency #update #liquibase #db #sql #路径
公司项目光对接口,有没有什么快速对接口的方法?

公司项目总是在不停的对接口,加解密还好,涉及到字段非常多的报文,挨个处理 json 、数据库、实体太费劲了,现在是手动把表建出来,然后用若依的代码生成器批量生成、下载、复制、粘贴,尤其是 spring 还得处理 dto 、entity 、vo 啥的,还要搞 service 、serviceImpl ,效率太低了

有没有什么快速对接口的方法?现在是准备用 nextjs 写个代码生成器,根据 json 自动生成主子表的 sql 、mapper 、bean 、controller 、vue components ,打包发布,已经完成了,sql 、mapper 、bean 的创建

是否还有其他更好 /效率更高的方式去对接口?

因为除了对接口还有写 vue 界面,无聊的一批

#对接口 #代码生成 #json #sql #mapper #bean #vue #效率 #生成 #加解密
go 每一个数据库库使用起来都不太方便,有木有

感觉没有一个方便好用的库,每一个都有使用的痛点,gorm 查询返回 error 中记录不存在也会返回 error,导致每处的查询的 error 都要做是不是记录不存在的特殊判断;sqlx 原生 sql,比较喜欢,又没有单表增删改查的封装,也很通。不知道大家有木有这样的感觉,有没有推荐的库

#error #查询 #返回 #记录 #痛点 #gorm #每处 #sqlx #sql #单表
有没有这么一个后端服务项目

sql 全部由前端写,前端写好传给后端,这样对于一些简单的增删改查项目,只需要几个简单通用的后端 api 就可以了。

#前端 #sql #改查 #api #简单 #增删 #传给 #通用 #全部 #项目
关于 MySQL 的全文查询,是不是没有高效的办法限定在一个结果集里搜全文?

打算给 App 加个简单的搜索功能,不想搞得太复杂,所以就先试了下 MySQL 内置的全文,
比如我要限定在一个用户的文章里搜:

```sql
select * from article
where
user_id = ?
match (title) against ('+???' in boolean mode)
```

这么干的话貌似会先用全文索引搜索全部用户的文章,然后按用户 ID 一行行过滤,我试了下性能似乎不太好,在千万非 SSD 表上要个 0.5 秒。

然后我看了下 MySQL 可以同时搜索二个关键词,那我建一列 meta ,放用户 ID,然后我同时搜索这个用户 ID 和关键词:

```sql
select * from article
where match (meta, title) against ('+??? +USERID_???' in boolean mode)
```

发现性能几乎完全一致也要 0.5 秒。
但我单搜一个关键词就非常快 0.001 秒级别的。

```sql
select * from article
where match (meta, title) against ('+???' in boolean mode)
```

所以 MySQL 的全文搜索就是只能搜索一个条件是非常快的,其它的条件都是在前一个搜索结果里过滤?
所以这是 MySQL 全文的限制还是别的全文方案也是只能搜索一个关键词才是快的?

所以你们实现搜索某用户的文章是用的什么办法?

#搜索 #MySQL #用户 #sql #select #article #where #match #title #against
mysql or 关键字的执行问题

关于 mysql 的 or 查询,比如 select...from...where name=xxx or age =xxx 。这一条 sql 语句,在 mysql 执行的时候,是把 sql 拆分为 select...from...where name=xxx 拿到结果临时存起来再执行 select...from...where age =xxx 再跟前面的结果进行合并呢,还是 就当做一条语句执行?因为,在看关于 or 的索引失效的问题,解决方案是 or 前后的字段都需要加索引,我感觉是把 select...from...where name=xxx or age =xxx 拆分开执行的?有没有大佬跟我讲解下。谢谢

#... #xxx #select #where #name #age #mysql #sql #执行 #语句