如何将“json查询”转换为“sql查询”?

How to convert `json query` to `sql query`?

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

AngularJS 应用程序正在将此 JSON 查询发送到我的 Django-Restframework 后端,因此我需要将该 JSON 查询转换为 SQL 查询,以便能够到 运行 原始 SQL 以及之前对 select.

允许的 tables/models 的验证

我不需要完整的 JSON 查询到 SQL 查询翻译,我只想翻译 select 支持 "where"、"and", "or", "group_by".

为了更好地理解我的问题,我放了以下片段:

{
  "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。

您可以编写一些自定义 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/

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

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

发送所有 AngularJS 查询

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 class:

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","")