如何将“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","")
我有一个 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","")