如何将`json query`转换为`sql query`?

时间:2015-12-22 15:49:42

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

我有一个AngularJS应用程序,用于构建JSON格式的查询,这些查询是使用许多表,字段和运算符构建的,例如“join”,“inner”,“where”,“and”,“or”,“比如“等等。

AngularJS App正在将此JSON查询发送到我的Django-Restframework后端,因此我需要将该JSON查询转换为SQL查询,以便能够运行原始SQL以及之前对哪些表/模型进行选择的验证。< / p>

我不需要对SQL查询翻译进行完整的JSON查询,我只想翻译选择,支持“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。

2 个答案:

答案 0 :(得分:1)

我找到了一个将JSON查询转换为SQL查询的NodeJS包(https://www.npmjs.com/package/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","")

答案 1 :(得分:0)

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

或者你可以在控制器中使用$ scope.output = ...

jsfiddle here:https://jsfiddle.net/jsheridan390/fpbp6cz0/1/