JavaScript 怎么写 SQL 好?

2018 年 11 月 12 日
 Cbdy

使用 JavaScript 的模版字符串可以比较方便的写多行的 SQL

const res = await db.query(`
SELECT *
FROM foo
WHERE foo.bar = 'baz'
`)

但是遇到 SQL 里面的反引号符号怎么处理呢?

const res = await db.query(`
SELECT \`name\`, \`privilege\`
FROM \`user\`
`)

还是要自己处理转义,一下很不直观了,说到底还是 JavaScript 不支持 Raw String,有没有什么比较好的解决方案呢?

6423 次点击
所在节点    JavaScript
17 条回复
liuhaotian
2018 年 11 月 12 日
Cbdy
2018 年 11 月 12 日
@liuhaotian 无用的答案
PythonAnswer
2018 年 11 月 12 日
ltoddy
2018 年 11 月 12 日
为什么不用 orm 呢?
airyland
2018 年 11 月 12 日
sequelize, 特殊情况下才自己拼接。或者 knexjs 之类的工具。
fyibmsd
2018 年 11 月 12 日
orm
zhouzm
2018 年 11 月 12 日
Sparetire
2018 年 11 月 13 日
sutra
2018 年 11 月 13 日
SQL 中会有反引号的好像是 MySQL 特有的吧,PostgreSQL 似乎是用双引号的。
Cbdy
2018 年 11 月 13 日
@PythonAnswer 很有想法,用预处理
Cbdy
2018 年 11 月 13 日
@zhouzm MyBatis 还魂😂
jiangzhuo
2018 年 11 月 13 日
本来一个模板字符串写 SQL 的事情,SQL builder 就算了,竟然各种 ORM 都出来了。

其实 JS 是支持的 raw string 的,模板字符串就是对标的 Python 中的‘ r ’和 C#中的‘@’,只是 ES 还在完善( ES 提案年年有,一直在更新)。当初为啥选 backquote,是因为 ASCII 里没用被用的字符就那么几个了(我猜大概 MYSQL 也是这么想的)
现在楼主的需求很简单,就是能多行写字符串而已。
第一种方法最简单,改改编译器,把 backquote 换成另外一个不用的字符就行了,但是改完就不符合 ES6 了,也就不能称为 JS 了。
第二种办法,不改编译器,现在 JS 能认的多行字符串还有一种就是 /*和*/之间的字符串,用作注释,也幸亏我们 JS 是解释执行的语言以下方法才能行得通(不过现在 strict mode 不让访问 callee 了)。

https://gist.github.com/jiangzhuo/15b16ebeafdcff7b595641ab8dc7c345
Cbdy
2018 年 11 月 13 日
@jiangzhuo 符号不够数量来凑,比如 Python 的方案''',Java 的方案``
y7E6IG8spV7TU8n7
2018 年 11 月 13 日
356693212
2018 年 11 月 13 日
orm
seanhuai
2018 年 11 月 13 日
所以为什么要拼接语句呢...大把的 orm
e8c47a0d
2018 年 11 月 23 日
MongoDB 飘过

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

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

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

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

© 2021 V2EX