V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
Cbdy
V2EX  ›  JavaScript

JavaScript 怎么写 SQL 好?

  •  
  •   Cbdy · 2018-11-12 20:36:03 +08:00 · 5387 次点击
    这是一个创建于 2190 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 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,有没有什么比较好的解决方案呢?

    第 1 条附言  ·  2018-11-13 19:19:26 +08:00

    JavaScript有很多很好用的ORM,但是写SQL?

    目前看到的几个比较可行的方法:

    • 模板引擎(#7)
    • JSX之类的语法糖,实际运行前加一层编译(Babel,TypeScript)(#3,#12)
    • 注释,但是这个不考虑了,现在基本都ES2015的Class,默认strict了(#12)
    • 等EcmaScript的新Proposal,但是我目前没有看到类似的Proposal(#12)
    17 条回复    2018-11-23 11:46:44 +08:00
    Cbdy
        2
    Cbdy  
    OP
       2018-11-12 21:59:28 +08:00 via Android
    @liuhaotian 无用的答案
    ltoddy
        4
    ltoddy  
       2018-11-12 22:18:25 +08:00
    为什么不用 orm 呢?
    airyland
        5
    airyland  
       2018-11-12 22:25:35 +08:00
    sequelize, 特殊情况下才自己拼接。或者 knexjs 之类的工具。
    fyibmsd
        6
    fyibmsd  
       2018-11-12 22:26:28 +08:00 via iPhone
    orm
    zhouzm
        7
    zhouzm  
       2018-11-12 22:42:17 +08:00   ❤️ 1
    Sparetire
        8
    Sparetire  
       2018-11-13 02:13:58 +08:00 via Android
    sutra
        9
    sutra  
       2018-11-13 02:30:32 +08:00
    SQL 中会有反引号的好像是 MySQL 特有的吧,PostgreSQL 似乎是用双引号的。
    Cbdy
        10
    Cbdy  
    OP
       2018-11-13 05:10:23 +08:00 via Android
    @PythonAnswer 很有想法,用预处理
    Cbdy
        11
    Cbdy  
    OP
       2018-11-13 05:13:52 +08:00 via Android
    @zhouzm MyBatis 还魂😂
    jiangzhuo
        12
    jiangzhuo  
       2018-11-13 05:36:46 +08:00
    本来一个模板字符串写 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
        13
    Cbdy  
    OP
       2018-11-13 06:03:48 +08:00 via Android
    @jiangzhuo 符号不够数量来凑,比如 Python 的方案''',Java 的方案``
    y7E6IG8spV7TU8n7
        14
    y7E6IG8spV7TU8n7  
       2018-11-13 10:40:06 +08:00
    356693212
        15
    356693212  
       2018-11-13 12:02:43 +08:00
    orm
    seanhuai
        16
    seanhuai  
       2018-11-13 18:23:25 +08:00
    所以为什么要拼接语句呢...大把的 orm
    e8c47a0d
        17
    e8c47a0d  
       2018-11-23 11:46:44 +08:00
    MongoDB 飘过
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1312 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:31 · PVG 01:31 · LAX 09:31 · JFK 12:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.