2017-06-03 2 views
8

J'ai besoin de connecter deux bases de données. la base de données par défaut est fixe mais l'autre est dynamique, basée sur l'URL.Connexion de base de données dynamique Flask-SQLAlchemy

par exemple si l'URL est: yourapp.myweb.com alors deuxième nom de base de données sera yourapp

i essayer connecter base de données dans initialisation .py mais son erreur suivant me montrer

builtins.AssertionError 
AssertionError: A setup function was called after the first request was handled. This usually indicates a bug in the application where a module was not imported and decorators or other functionality was called too late. 
To fix this make sure to import all your view modules, database models and everything related at a central place before the application starts serving requests. 

ici est mon .py initialisation

from flask import Flask,session 
from flask_sqlalchemy import SQLAlchemy 
import os 
app = Flask(__name__,static_url_path='/static') 

# Database Connection 
database = request.url.split("/")[2].split(".")[0] 
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:[email protected]/main_database" 
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True 
app.config['SQLALCHEMY_BINDS'] = { 
    'user_db': 'mysql+pymysql://root:[email protected]/database_'+str(database), #dynamic Connection 
} 
db = SQLAlchemy(app) 
db.create_all() 
db.create_all(bind=['user_db']) 
# db.init_app(app) 

from . import views 

est ici le viwe.py

@app.route('/login', methods = ['GET']) 
def index(): 
    try: 
     from .model import Users 
     # Some Code 
    except Exception as e: 
     raise e 
     # return "Failed to login ! Please try again." 

est ici le model.py

from application import db 
class Users(db.Model): 
    __bind_key__ = 'user_db' 
    __tablename__ = 'users' 
    id = db.Column(db.Integer, primary_key = True) 
    email = db.Column(db.String(50)) 
    name = db.Column(db.String(50)) 
    password = db.Column(db.String()) 

    def __repr__(self): 
     return '<User %r>' % self.name 
+0

Je pense que quand je démarre mon application, il n'y a pas de request.url donc peut-être .. –

+0

s'il y a problème ci-dessus alors quel fichier .py est le meilleur pour se connecter à la base de données? –

+0

Essayez de placer 'from .model import Users' au niveau supérieur du module. – Fian

Répondre

4

Comme je l'ai dit dans un de mes commentaires, cela pourrait être un problème avec la connexion de base de données. Voici ce que je vérifierais pour:

  1. Tout d'abord, assurez-vous que vous avez le bon moteur installé dans votre environnement virtuel (vous pouvez vérifier facilement en exécutant pip list, juste au cas où, laissez-moi insister pour que les bibliothèques ont besoin à installer dans un virtual environment). Assurez-vous que vous n'avez pas pymysql, mais le port à Python3, appelé mysqlclient. pymysql ne fonctionne qu'avec Python2. Pour installer cette bibliothèque, vous devez d'abord installer les en-têtes de développement Python et MySQL. Par exemple, dans Debian/Ubuntu:

    sudo apt-get install python-dev libmysqlclient-dev 
    

    Ensuite, vous pouvez installer la bibliothèque avec la commande suivante:

    pip install mysqlclient 
    
  2. Si cela est installé, assurez-vous que vous pouvez réellement se connecter à la base de données en utilisant la bibliothèque. Ouvrez un shell Python dans l'environnement virtuel et tapez ce qui suit (de l'exemple github):

    import pymysql.cursors 
    
    connection = pymysql.connect(host='<you_host>', 
              user='<user>', 
              password='<password>', 
              db='<database_name>', 
              charset='utf8mb4', 
              cursorclass=pymysql.cursors.DictCursor) 
    
    try: 
        with connection.cursor() as cursor: 
         do_something() 
    except: 
        pass 
    
  3. Si cela fonctionne, assurez-vous que vous utilisez la version la plus récente de Flask (0.12 at the moment, ce nouveau vous pouvez vérifier en exécutant pip list), car il y a plusieurs bogues liés à l'exécution de Flask en mode DEBUG qui ont été corrigés au fil du temps.

  4. Ce n'est certainement pas le cas ici, mais une autre vérification d'intégrité vérifie qu'aucun autre processus n'est en cours d'exécution sur le port que vous souhaitez utiliser pour Flask.

Si tout ce qui précède fonctionne correctement, je devrais voir un peu de la trace de la pile pour comprendre ce qui se passe réellement.

+0

Antonio Haro remercie votre suggestion. mais c'est toujours donner une erreur. –

+0

la chose est que je dois obtenir le nom de base de données d'url et j'essaye d'obtenir la base de données comme cette base de données = request.url.split ("/") [2] .split (".") [0] . –