2015-12-22 58 views
1

我有一个AngularJS应用程序设计用于以JSON格式构建查询,这些查询使用许多表,字段和运算符(如“join”,“inner”,“where”,“and”,“or”,“ “等如何将json查询转换为sql查询?

AngularJS应用程序发送此JSON查询到我的Django Restframework后端,所以我需要将该JSON查询翻译成SQL查询,以便能够运行原始SQL与以前的验证是什么表/模型允许选择。

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

+0

创建自己的库/服务,这将足够聪明,采取JSON和创建SQL。 –

+0

我发现这个包:https://www.npmjs.com/package/json-sql我想知道如果你知道类似的python的东西。 – Klahnen

回答

1

我发现了一个包的NodeJS(https://www.npmjs.com/package/json-sql)谁JSON查询转换为SQL查询,所以我做了一个脚本的NodeJS,然后我在Python中创建一个类来调用脚本的NodeJS。

用这种方法我只需要发送以下这句法(https://github.com/2do2go/json-sql/tree/master/docs#join

脚本的NodeJS所有AngularJS查询。

// 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","") 
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这里:https://jsfiddle.net/jsheridan390/fpbp6cz0/1/