V2EX POST
648 subscribers
138 photos
31 videos
99 files
104K links
v2ex新贴定时推送,可按需置顶本频道然后关闭通知
Download Telegram
总感觉数据库 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 #执行 #语句