【问题标题】:Convenient way to wrap long SQL statements in javascript在 javascript 中包装长 SQL 语句的便捷方法
【发布时间】:2016-02-12 08:05:27
【问题描述】:

在python中,可以使用“”来包装长的MySQL语句。例如,

sql = """CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""

但是,如果我在 javascript 中尝试相同的操作,则会出现语法错误。

connection.query("""CREATE TABLE EMPLOYEE (
FIRST_NAME  CHAR(20) NOT NULL,
    LAST_NAME  CHAR(20),
    AGE INT,
    SEX CHAR(1),
    INCOME FLOAT )"""


    , function (err, rows, fields) {
    if (err) throw err;
    res.send(rows);
});

python 的"""string 封装是否有某种 javascript 等价物?如果不是,在 javascript 中封装长 MySQL 字符串语句的一些最佳实践是什么?

我正在使用 node.js restify 客户端。

【问题讨论】:

标签: javascript python mysql node.js string


【解决方案1】:

如果您使用的是支持 ES6 的 node.js,这应该不是问题。 ES6 javascript 现在支持使用以下语法的多行字符串。

sql = `CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )`

【讨论】:

    【解决方案2】:

    在 JavaScript 中处理长字符串:

    var sql = "CREATE TABLE EMPLOYEE (" +
                 " FIRST_NAME  CHAR(20) NOT NULL," +
                 " LAST_NAME  CHAR(20)," +
                 " AGE INT," +
                 " SEX CHAR(1)," +
                 " INCOME FLOAT )";
    

    Python 的三重引号很棒!不幸的是,在 JavaScript 中,您只有两种选择:

    • + 基于串联,如上
    • @Nina Scholz 提出的基于\ 的延续

    就我个人而言,我不喜欢使用\ 进行续行(在任何语言中)。使用+ 也不会在字符串中引入不必要的空格。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您可以在行尾使用反斜杠\ 将字符串分布在多行上。

      var sql = "CREATE TABLE EMPLOYEE ( \
                 FIRST_NAME  CHAR(20) NOT NULL, \
                 LAST_NAME  CHAR(20), \
                 AGE INT, \
                 SEX CHAR(1), \
                 INCOME FLOAT )";
      document.write(sql);

      【讨论】:

        【解决方案4】:

        对于未来较大的SQL statments,一个技巧是在MySQL中使用函数或procedures,然后在一行中调用它:

        var sql = select * from getEmployee(); // function getEmployee returns the query

        【讨论】:

          【解决方案5】:

          在这个答案中,我建议通过字符串数组暂存您的多行字符串。然后,一旦暂存完成,您就可以使用join 来最终确定多行字符串,以强制行用换行符分隔。

          在 Sumukh Barve 的回答中,字符串是用空白字符分隔符(而不是换行符)精心构造的。这本身并没有错,但是,它可能导致 SQL 语句格式错误。在维护此类 SQL 语句时,维护者很容易忽略对空格字符的需求,并可能无意中使 SQL 语句格式错误:

          "CREATE TABLE" +
          "EMPLOYEE (" + //...
          

          会导致:

          "CREATE TABLEEMPLOYEE (" + //...
          

          join 的使用还有助于确保有一个强制性的换行符分隔行,而无需记住在每行的文本中添加它。

          [ "CREATE TABLE",
            "EMPLOYEE (" ].join("\n")
          

          会导致:

          CREATE TABLE
          EMPLOYEE (
          

          没有换行符,所有的错误都会在第一行报错。例如在PSQL上:

          CREATE TABLE EMP (ID);
          

          会报告:

          ERROR:  syntax error at or near ";"
          LINE 1: TABLE EMP(ID);
          

          无论 SQL 语句有多长,所有错误都将针对 LINE 1 报告。

          但是,如果添加了新行,例如

          CREATE TABLE EMP (
              ID);
          

          您将获得更好的反馈,了解是哪一行导致了错误:

          ERROR:  syntax error at or near ";"
          LINE 2: ID);
          

          还使用带有换行符的join 有助于记录。

          请注意,由于 ES6 反引号表示法,@user781486 答案中存在隐式换行分隔符。 ES6 反引号符号看起来很简单。但是,当您决定将反引号符号与条件业务规则混合使用时,它会迅速失去其简单性。

          您的里程可能会有所不同。

          function buildSQL(includeAge) {
            let arr = [];
            arr.push( "CREATE TABLE EMPLOYEE (" );
            arr.push( "    FIRST_NAME  CHAR(20) NOT NULL," );
            arr.push( "    LAST_NAME   CHAR(20), " );
            if (includeAge) {
                arr.push( "    AGE         INT," );
            }
            arr.push( "    SEX         CHAR(1)," );
            arr.push( "    INCOME      FLOAT " );
            arr.push( "); " );
            let sql = arr.join("\n");
            return sql;
          }
          
          function refreshSQL() {
            let includeAge = $("#includeAge").is(':checked');
            let sql = buildSQL(includeAge);
            $("#resultSQL").val(sql);
          }
          
          $("#includeAge").on('change', refreshSQL);
          
          refreshSQL();
          <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
          
          <p><label><input type="checkbox" id="includeAge"/>includeAge</label></p>
          
          <p><textarea id="resultSQL" style="width:400px; height:150px">
          </textarea></p>

          【讨论】:

          • Sumukh Barve 的回答与此基本相同,只是它避免了创建数组然后连接多个字符串的开销。
          • @computercarguy using Array.join is answer is not the same as Sumukh Barve's answer。我已经说明了主要原因。包含换行符以及将行与条件一起附加的能力。虽然+ 的使用很容易理解,但当您希望包含换行符时,您很快就会被撤消。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-10-25
          • 2012-10-13
          • 1970-01-01
          • 1970-01-01
          • 2019-03-11
          • 2017-08-08
          • 1970-01-01
          相关资源
          最近更新 更多