1

У меня есть приложение AngularJS, предназначенное для создания запросов в формате JSON, эти запросы построены с использованием множества таблиц, полей и операторов, таких как «join», «inner», «where», «and», «or», «like», »и т. д.Как преобразовать `json query` в` sql query`?

Приложение AngularJS отправляет эти запросы JSON в мой back-back-файл Django-Restframework, поэтому мне нужно перевести этот запрос JSON в SQL-запрос, чтобы иметь возможность запускать Raw SQL с предыдущими проверками того, какие таблицы/модели разрешено для выбора.

Мне не нужен полный запрос JSON для перевода SQL-запросов, я просто хочу перевести selects с поддержкой предложений, таких как «где», «и», «или», «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 скрипт.

При таком подходе я просто нужно отправить все 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","") 
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/