16

Ho esaminato la documentazione di Google Cloud SQL e varie ricerche, ma non riesco a scoprire se è possibile utilizzare SQLAlchemy con Google Cloud SQL e, in tal caso, quale dovrebbe essere l'URI di connessione.È possibile utilizzare SQLAlchemy con Google Cloud SQL?

sto cercando di utilizzare l'estensione Flask-SQLAlchemy e hanno bisogno la stringa di connessione in questo modo: mysql://username:[email protected]/db

ho visto l'esempio Django, ma sembra che la configurazione utilizza uno stile diverso rispetto alla stringa di connessione. https://developers.google.com/cloud-sql/docs/django

documentazione Google Cloud SQL: https://developers.google.com/cloud-sql/docs/developers_guide_python

risposta

37

Aggiornamento

Google Cloud SQL ora supporta l'accesso diretto, quindi è ora possibile utilizzare il dialetto MySQLdb. La connessione raccomandata tramite il dialetto mysql utilizza il formato URL:

mysql+mysqldb://[email protected]/<dbname>?unix_socket=/cloudsql/<projectid>:<instancename> 

mysql+gaerdbms è stato deprecato in SQLAlchemy a partire dalla versione 1.0

Lascio la risposta originale al di sotto nel caso in cui gli altri a trovare ancora utile.


Per chi visita questa domanda dopo (e non vogliono leggere tutti i commenti), SQLAlchemy ora supporta Google Cloud SQL a partire dalla versione 0.7.8 utilizzando la stringa di connessione/dialetto (vedi: docs):

mysql+gaerdbms:///<dbname> 

esempio:

create_engine('mysql+gaerdbms:///mydb', connect_args={"instance":"myinstance"}) 

ho proposto un 012.371.575,694 milaal dialetto mysql+gaerdmbs:// per supportare entrambe le API di Google Cloud SQL (rdbms_apiproxy e rdbms_googleapi) per la connessione a Cloud SQL da un'istanza di produzione di app non di Google (ad es. la tua workstation di sviluppo).La modifica modificherà anche leggermente la stringa di connessione includendo il progetto e l'istanza come parte della stringa e non richiederà di essere passata separatamente tramite connect_args.

E.g.

mysql+gaerdbms:///<dbname>?instance=<project:instance> 

Questo renderà anche più facile da usare Cloud SQL con la boccetta-SQLAlchemy o altra estensione in cui non si fanno in modo esplicito la chiamata create_engine().

Se si verificano problemi di connessione a Google Cloud SQL dalla workstation di sviluppo, è possibile dare un'occhiata alla mia risposta qui: https://stackoverflow.com/a/14287158/191902.

+3

FYI per tutti gli altri che si imbattono in questa risposta: questo metodo non è più raccomandato da SQLAlchemy; usa invece il dialetto MySQLdb: [doc link] (http://docs.sqlalchemy.org/en/latest/dialects/mysql.html?highlight=appengine#module-sqlalchemy.dialects.mysql.gaerdbms) – eaj

4

è fattibile, anche se non ho usato Flask a tutti, quindi non sono sicuro di stabilire la connessione attraverso quella. Ho ottenuto che funziona attraverso la Piramide e presentato una patch per SQLAlchemy (forse per il repo sbagliato) qui:

https://bitbucket.org/sqlalchemy/sqlalchemy/pull-request/2/added-a-dialect-for-google-app-engines

che da allora è stato sostituito e accettato in SQLAlchemy come

http://www.sqlalchemy.org/trac/ticket/2484

I non penso che sia comunque destinato a un rilascio.

Ci sono alcuni problemi con Google SQL che generano eccezioni diverse, quindi abbiamo riscontrato problemi con la distribuzione automatica di un database. È inoltre necessario disabilitare il pool di connessioni usando NullPool come menzionato nella seconda patch.

Abbiamo poi trasferito ad usare il datastore attraverso NDB quindi non ho seguito il progesso di queste correzioni per un po '..

+0

sarebbe condividere le ragioni della decisione di passare a NDB? – van

+0

Fondamentalmente crediamo che sia meglio adattarsi a quello che stiamo facendo. Abbiamo iniziato a utilizzare SQLAlchemy perché conoscevamo SQL/RDBMS e pensavamo che fosse almeno uno dei migliori Python ORMS là fuori (dopo alcune ricerche limitate). Ma alla fine la complessità di mappare un RDBMS ad oggetti nel tuo codice sembra uno spreco di energie senza una buona ragione per andare lì quando puoi semplicemente salvare quegli oggetti direttamente in un datastore no-sql. – lecstor

+0

Stavo cercando di utilizzare SQL per un progetto che ha un grande focus sulla creazione di report, poiché la natura NoSQL di GAE DataStore (db/ndb) non è facile da utilizzare senza un sacco di de-normalizzazione e riduzione della mappa. Sarebbe bello se ci fosse qualcosa come Apache Hive per GAE, ma ora sto andando fuori tema. Analizzerò il changeset del problema SQLAlchemy e passerò da lì. Posso rivisitare l'uso del DataStore e risolvere le complicazioni. So che è sicuramente possibile (tutto di Google funziona in questo modo), solo più complicato per il nostro team. –

7

Sì,

Se trovate qualche bug in SA + Cloud SQL, per favore fatemelo sapere. Ho scritto il codice dialetto che è stato integrato in SQLAlchemy. C'è un po 'di sciocco business su come Cloud SQL fa scoppiare le eccezioni, quindi potrebbero esserci dei problemi.

0

Per chi preferisce PyMySQL oltre MySQLdb (che viene suggerito nella risposta accettata), le stringhe di connessione SQLAlchemy sono:

Per Produzione

mysql+pymysql://<USER>:<PASSWORD>@/<DATABASE_NAME>?unix_socket=/cloudsql/<PUT-SQL-INSTANCE-CONNECTION-NAME-HERE>

Assicurati di

  1. Aggiungere gli insi di SQL tanza al tuo app.yaml:

    beta_settings: 
        cloud_sql_instances: <PUT-SQL-INSTANCE-CONNECTION-NAME-HERE> 
    
  2. Attiva l'API SQL Admin as it seems to be necessary:

    https://console.developers.google.com/apis/api/sqladmin.googleapis.com/overview

per lo sviluppo locale

mysql+pymysql://<USER>:<PASSWORD>@localhost:3306/<DATABASE_NAME>

dato che è stato avviato il Cloud SQL Proxy con:

cloud_sql_proxy -instances=<PUT-SQL-INSTANCE-CONNECTION-NAME-HERE>=tcp:3306

Problemi correlati