2015-10-24 17 views
6

Voglio collegarmi a un database postgres preesistente che non ha modelli associati con esso nella mia app. Forse non sorprende, questo si sta dimostrando fastidioso aggiunto al quale questo è il mio primo tentativo con Python e Flask.utilizzando Flask, python e postgresql come posso connettermi a un database preesistente?

Il codice/PY app è:

import os 
from flask import Flask 
from flask import render_template 
from flask.ext.sqlalchemy import SQLAlchemy 
from sqlalchemy import create_engine, Column, Integer, String 
from sqlalchemy.ext.declarative import declarative_base 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://blah:[email protected]:5432/mydb' 
db = SQLAlchemy(app) 
db.create_all() 
db.session.commit() 

@app.route("/") 
def main(): 
    return render_template('index.html') 


@app.route('/base') 
def base(): 
    myusers = users.all() 
    return render_template('base.html') 

if __name__ == '__main__': 
    app.run(debug=True) 

il def main() funziona in modo tale che tanto mi hanno raggiunto.

Nella vista (base.html) abbiamo:

{% for user in myusers %} 
    <div><p>{{ user.first_name }} </b></p></div> 
    {% endfor %} 

Quando vado alla pagina di base.html l'errore persistente è NameError: global name 'users' is not defined

Che, di molte cose, probabilmente, ci faccio sbagliato qui? Tutto l'aiuto è apprezzato. Grazie.

risposta

8

È necessario eseguire il reverse engineering del database esistente per generare i modelli Python che SQLAlchemy può utilizzare.

sqlacodegen può farlo per voi, installarlo utilizzando pip - pip install sqlacodegen

Dal prompt dei comandi è possibile generare i vostri modelli con il seguente:

sqlacodegen --outfile c:/temp/models.py postgres://blah:[email protected]:5432/mydb 

Copiare il file models.py generato nel cartella del progetto e non dimenticare di importare le classi del modello necessarie, ad es la tua classe utente.

Controllare il file models.py per vedere come le tabelle sono state convertite in classi e in particolare l'intelaiatura dei nomi delle classi generate, ad esempio "Utente" o "utente".

È necessario passare i "myusers" variabile per il modello, assumendo che la classe utente generata in models.py si chiama "Utente":

@app.route('/base') 
def base(): 
    myusers = db.session.query(User).all() 
    return render_template('base.html', myusers=myusers) 

Non dimenticate di importare il modello utente al all'inizio del file app.py (è necessario controllare il nome della classe utente che è stato generato da sqlacodgen):

from models import User 
+0

grazie farò dare un colpo e quindi eseguire python models.py? – user1903663

+0

grazie ha prodotto un bellissimo file come da lei suggerito. Cosa faccio ora? Mi dispiace essere un vero maniaco. Quindi importare nel mio file di app o fare modelli Python, py? O qualcos'altro ...? – user1903663

+0

Vedere la risposta aggiornata. – pjcunningham

Problemi correlati