2014-07-14 10 views
5

Does Waterline dispone di supporto per l'esecuzione di join SQL (oltre a query())? Ho impostato le associazioni nei miei modelli, ma le query SQL effettivamente generate sono istruzioni di selezione in loop. Attualmente esiste solo il supporto per "n + 1 seleziona"? Mi manca un'opzione di configurazione da qualche parte?Sails Waterline SQL join in popolare

Ecco un esempio di una> Molti popolano 1- che è un loop select: (Vele/galleggiamento/vele-mysql v0.10.0-RC8)

/** 
* City.js 
*/ 
module.exports = { 
"adapter": "someMysqlServer", 
"tableName": "city", 
autoCreatedAt: false, 
autoUpdatedAt: false, 
schema: true, 
attributes: { 
    "id": { 
     "type": "integer", 
     "primaryKey": true, 
     "autoIncrement": true, 
     "columnName": "ID" 
    }, 
    "Name": { 
     "type": "string", 
     "maxLength": 35 
    }, 
    "District": { 
     "type": "string", 
     "maxLength": 20 
    }, 
    "Population": { 
     "type": "integer" 
    }, 
    "CountryCode": { 
     //a city has one country 
     "model": "Country" 
    } 
}}; 




/** 
* Country.js 
*/ 

module.exports = { 
    "adapter": "someMysqlServer", 
    "tableName": "country", 
    autoCreatedAt: false, 
    autoUpdatedAt: false, 
    schema: true, 
    attributes: { 
     "id": { 
      "type": "string", 
      "required": true, 
      columnName: "Code", 
      "primaryKey": true, 
      "maxLength": 3 
     }, 
     "Name": { 
      "type": "string", 
      "maxLength": 52 
     }, 
     Continent: "string", 
     "Region": { 
      "type": "string", 
      "maxLength": 26 
     }, 
     SurfaceArea: "float", 
     IndepYear: "integer", 
     Population: "integer", 
     LifeExpectancy: "float", 
     GNP: "float", 
     GNPOld: "float", 
     LocalName: "string", 
     GovernmentForm: "string", 
     HeadOfState: "string", 
     Capital: "integer", 
     Code2: "string", 
     Cities: { 
      //country has many cities 
      "collection": "City", 
      "via": "CountryCode" 
     } 
    } 
}; 

Poi, quando ci si dirige verso il mio http://localhost:1337/country?populate=[Cities] log mostrano il seguente SQL è stata eseguita:

SELECT `country`.`Name`, `country`.`Continent`, `country`.`Region`, `country`.`SurfaceArea`, `country`.`IndepYear`, `country`.`Population`, `country`.`LifeExpectancy`, `country`.`GNP`, `country`.`GNPOld`, `country`.`LocalName`, `country`.`GovernmentForm`, `country`.`HeadOfState`, `country`.`Capital`, `country`.`Code2`,`country`.`Code` FROM `country` LIMIT 30 OFFSET 0 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ABW' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AFG' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AGO' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AIA' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ALB' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AND' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ANT' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ARE' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ARG' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ARM' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ASM' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ATA' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ATF' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='ATG' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AUS' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AUT' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='AZE' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BDI' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BEL' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BEN' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BFA' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BGD' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BGR' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BHR' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BHS' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BIH' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BLR' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BLZ' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BMU' LIMIT 30 
SELECT `city`.`Name`, `city`.`CountryCode`, `city`.`District`, `city`.`Population`, `city`.`ID` FROM `city` WHERE `city`.`CountryCode`='BOL' LIMIT 30 
+0

Ho lo stesso problema. Provando se uso l'url? Populate = [model] ottengo lo stesso comportamento. Se richiamo esplicitamente Model.find(). Populate ('OtherModel') ottengo una versione leggermente più ottimizzata (usando IN) ma ancora nessuna join. – Rowan

risposta

1

il .populate() attuazione in beta, è volutamente semplificata per supportare la più ampia gamma possibile di adattatori. Nella versione finale v0.10, gli adattatori SQL "core" supportati (sails-mysql e sails-postgresql) eseguiranno i join effettivi.

+0

@ sgress454Qualsiasi aggiornamento su questo? Ho appena installato vele 0.10.2 e sails-mysql 0.10.4 e mysql logs mostrano il seguente output: '(SELECT * FROM city AS city WHERE CountryCode =" ABW "ORDINA BY city.id ASC LIMIT 30) UNION (SELECT * FROM città AS città WHERE CountryCode = "AFG" ORDINA PER città.id LIMITE ASC 30) UNIONE (SELEZIONA * DA città AS città DOVE CountryCode = "AGO" ORDINA PER città.id LIMITE ASC 30) (...) ' – jaredfromsubway

+0

Questo è perché stai colpendo il percorso del modello che ha un limite predefinito di 30 record. In questo caso non è possibile eseguire un join semplice perché la query restituirebbe solo 30 righe, dove ciò che si desidera veramente è di 900 righe (30 paesi, ciascuno con 30 città). Da qui il 'UNION', che è ancora molto meglio di una query separata per ogni paese. Se riesci a ridurlo a una singola query, saremmo molto interessati a vederlo! Vedi [questo articolo] (http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/) per maggiori informazioni sul problema. – sgress454