我有一个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。
答案 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/