2015-12-22 83 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/