数据库操作你是喜欢 ORM 还是手写 SQL

2017-09-28 19:58:12 +08:00
 twogoods
说说为什么?还有可以告诉我哪个语言下哪个库超好用吗?想多了解了解,尝试造个轮子,逃...
8736 次点击
所在节点    数据库
111 条回复
zgbgx1
2017-09-29 10:10:46 +08:00
性能要求高,还用的是 mysql 这种坑逼数据库的话,还是必须手写 sql
imherer
2017-09-29 10:21:05 +08:00
手写
testcount
2017-09-29 10:24:35 +08:00
我对外说的时候写 SQL,自己大部分是用 ORM。
xiaowangge
2017-09-29 10:25:10 +08:00
几乎不用 SQL。

99%场景用腾讯云的 memcached、redis。游戏行业。
leekafai
2017-09-29 10:26:57 +08:00
我自己喜欢手写,因为自己写的自己以后看得懂。
同理,我因此不喜欢别人手写,因为别人的我怕看不懂
timwei
2017-09-29 10:29:45 +08:00
我也是从 Rails 接触 ORM

ORM 的确可以让不熟 SQL 语句的我迅速开发数据库逻辑

可是也有些容易溷淆,大致整理几点:

1. ORM 方法对语言原生方法
order <-> sort
where <-> select

2. ORM 封装的逻辑,以 ActiveRecord 的关联查询举例
preload、eager_load、includes 三个方法出来的语句差异很大
新手时期对使用场景还不熟悉,常常乱

3. ORM 没封装的 SQL 操作
像是 ActiveRecord 没封装 bulk insertion (只有一个 delete_all 方法)
又得依赖三方库


我认为 ORM 主要的价值在让有一定编程经历,却不熟 SQL 语句的程序员操作数据库

次价值在数据库换型时,几乎不用更动代码
SQLite -> MySQL -> PgSQL 只需要切换 ORM 的配置,业务代码不用更改
justfly
2017-09-29 10:30:52 +08:00
orm

在互联网行业 mysql 基本当作持久化的 kv 来用,没有复杂 sql 和关联查询。性能基本不用考虑,绝大多数访问都命中缓存,发生缓存穿透 用 SQL 还是 ORM 基本没啥区别。
winnie2012
2017-09-29 10:48:13 +08:00
SQL 不利用重构
timwei
2017-09-29 10:52:24 +08:00
@msg7086

再提一点

conflicts = conflicts.where(protocol: [:udp, :both])
conflict = conflicts.first

逻辑上会与 conflict.where(protocol: [:udp, :both]).first 一样

可是产生的 SQL 语句会有差别,前者的语句会缺少 LIMIT
zpf124
2017-09-29 10:54:59 +08:00
@IllBeBack 可能是语言不同导致了你又这种想法。
最起码在 java 里 手写也可以 很容易的调用预编译 SQL 去解决参数注入的问题。
twogoods
2017-09-29 10:55:56 +08:00
@nekuata mybatis 不算 orm?这个问题大家可以讨论讨论
togodo
2017-09-29 10:56:30 +08:00
小项目手写,大项目 orm
coolcoffee
2017-09-29 10:58:31 +08:00
感觉 orm 更接近自然语言
qiu0130
2017-09-29 11:03:17 +08:00
我们公司的经历,开始 ORM,新项目 自己撸一层参数校验跑 SQL,目前打算改造一下 peewee 重构老项目。
Technetiumer
2017-09-29 11:13:20 +08:00
感觉 SQL 才更接近自然语言

一般用查询构造器,部分手写 SQL。

手写 SQL 比较符合我的直觉,查询构造器 /ORM 可以让你方便的跨数据库。
zpf124
2017-09-29 11:52:22 +08:00
@twogoods 之前有个类似的讨论,不过像我们这样的闲人不是很多。
https://www.zhihu.com/question/39454008

虽然我也更习惯 mybatis 去手写多表联查,但个人觉得 它不算是一个标准的 ORM 框架,功能上它与 ORM 框架可以互相替换。

因为 我觉得 ORM 框架 顾名思义 对象关系映射框架, 他是用来解决映射的,我只需要操作对象,或者导入的数据,中间的映射应该是这种框架去处理的。 而 mybatis 中间的映射则是我们自己写。
caoz
2017-09-29 11:55:47 +08:00
让我没想到的是竟然有这么多人喜欢手写... 别的不知道, 起码在 Python 中 SQLAlchemy 比手写好用太多了, 真心推荐大家来试下~

当然有时候免不了要手写, 比如现在 SQLAlchemy 还不支持一些 MySQL 中的 JSON 操作, 这时候就得用 SQLAlchey 的 text() 功能结合部分原生 SQL 语句了.
starvedcat
2017-09-29 12:28:53 +08:00
二进制程序大家喜欢写高级语言再编译还是手写机器码?请踊跃讨论!
Vans
2017-09-29 12:32:26 +08:00
手活好当然要手写了!
ospider
2017-09-29 12:35:03 +08:00
django...

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

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

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

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

© 2021 V2EX