【问题标题】:How to convert `json query` to `sql query`?如何将 `json 查询` 转换为 `sql 查询`?
【发布时间】:2016-03-28 22:32:17
【问题描述】:

我有一个 AngularJS 应用程序,旨在以 JSON 格式构建查询,这些查询由许多表、字段和运算符构建,例如“join”、“inner”、“where”、“and”、“or”、喜欢”等

AngularJS 应用程序正在将此 JSON 查询发送到我的 Django-Restframework 后端,因此我需要将该 JSON 查询转换为 SQL 查询,以便能够运行原始 SQL 并验证允许选择哪些表/模型。

我不需要完整的 JSON 查询到 SQL 查询的翻译,我只想翻译支持“where”、“and”、“or”、“group_by”等子句的选择。

为了更好地理解我的问题,我输入了以下 sn-ps:

{
  "selectedFields": {
    "orders": {
                "id": true,
                "orderdate": true},
    "customers": {
                  "customername": true,
                  "customerlastname": true}
  },
  "from": ["orders"],

  "inner_join":
    {
      "customers": {
        "on_eq": [
          {
            "orders": {
              "customderID": true
            },
          },
          {
            "customers": {
              "customerID": ture
            }
          }
        ]    
      }
    }
}

SELECT
    Orders.OrderID,
    Customers.CustomerName,
    Customers.CustomerLastName,
    Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;

我的例子来自:http://www.w3schools.com/sql/sql_join.asp

请注意,我不会尝试将任何 SQL 查询输出序列化为 JSON。

【问题讨论】:

  • 创建您自己的库/服务,该库/服务将足够智能以获取 json 并创建 SQL。
  • 我找到了这个包:npmjs.com/package/json-sql我想知道你是否知道 python 类似的东西。

标签: sql angularjs json django-rest-framework code-translation


【解决方案1】:

您可以编写一些自定义 JS 来解析对象,如下所示:

var selectedfields ='';
var fields = Object.keys(obj.selectedFields);
for (i=0;i<fields.length; i++) {
    var subfields = Object.keys(obj.selectedFields[fields[i]]);

  for (j=0;j<subfields.length; j++) {
    selectedfields = selectedfields + fields[i]+'.'+subfields[j]+' ';
  }
}

var from="";
for (i=0;i<obj.from.length; i++) {
    if (from=="") {
    from = obj.from[i]
  } else {
        from = from + ',' +obj.from[i]
  }
}
var output = 'SELECT '+selectedfields+ ' FROM '+from;

document.getElementById('output').innerHTML=output;

或者在 Angular 中,您可能会在控制器中使用 $scope.output = ...。

jsfiddle 在这里:https://jsfiddle.net/jsheridan390/fpbp6cz0/1/

【讨论】:

    【解决方案2】:

    我找到了一个 NodeJS 包 (https://www.npmjs.com/package/json-sql),它可以将 JSON 查询转换为 SQL 查询,所以我制作了一个 NodeJS 脚本,然后我在 Python 中创建了一个类来调用 NodeJS 脚本。

    使用这种方法,我只需要按照这种语法发送所有 AngularJS 查询 (https://github.com/2do2go/json-sql/tree/master/docs#join)

    NodeJS 脚本。

    // Use:
    //$  nodejs reporter/services.js '{"type":"select","fields":["a","b"],"table":"table"}'
    var jsonSql = require('json-sql')();
    
    var json_query = JSON.parse(process.argv[2]);
    
    var sql = jsonSql.build(json_query);
    
    console.log(sql.query);
    

    DRF 类:

    from unipath import Path
    import json
    from django.conf import settings
    from Naked.toolshed.shell import muterun_js
    
    
    full_path = str(Path(settings.BASE_DIR, "reporter/services.js"))
    
    
    class JSONToSQL:
    
        def __init__(self, json_):
            self.json = json_
            self.sql = None
            self.dic = json.loads(json_)
            self.to_sql()
    
        def to_sql(self):
            response = muterun_js('%s \'%s\'' % (full_path, self.json))
            if response.exitcode == 0:
                self.sql = str(response.stdout).replace("\n","")
    

    【讨论】:

      猜你喜欢
      • 2015-09-18
      • 2020-01-19
      • 2020-07-19
      • 2021-10-11
      • 2017-10-29
      • 2015-04-21
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多