2017-06-03 71 views
8

İki veritabanına bağlanmam gerekiyor. varsayılan veritabanı sabittir, diğeri ise dinamiktir, URL'ye dayanır.Dinamik veritabanı bağlantısı Flask-SQLAlchemy

örneğin url ise: yourapp.myweb.com sonra ikinci Veritabanı adı

i init .py ama onun şu göster bana hata içine veritabanına bağlanmak deneyin YourApp olacak

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. 

burada .py benim init olduğunu

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 

burada burada 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." 

olan benim yorumların birinde söylediği gibi, bu veritabanı bağlantısı ile ilgili bir sorun olabilir 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

Ben uygulamayı başlattığımda hiç bir request.url yok sanırım .. Yukarıdaki sorun varsa –

+0

o zaman hangi .py dosyası veritabanı bağlamak için en iyisidir? –

+0

Modemin üst düzeyindeki .model import Users 'öğesinden' 'yerleştirmeyi deneyin. – Fian

cevap

4

olduğunu. İşte kontrol yapardım: Eğer sanal ortamda yüklü sağ motor (eğer pip list çalıştırarak kolayca kontrol edebilirsiniz olduğundan emin olun, tüm

  1. Birinci; ihtimale karşı beni kütüphaneler ihtiyaç ısrar edelim virtual environment'a yüklenecek). pymysql, ancak mysqlclient olarak adlandırılan bağlantı noktası Python3 olmadığından emin olun. pymysql sadece Python2 ile çalışır. Bu kütüphaneyi kurmak için önce Python ve MySQL geliştirme başlıklarını kurmanız gerekir. Örneğin, Debian/Ubuntu:

    sudo apt-get install python-dev libmysqlclient-dev 
    

    Sonra şu komutla kütüphane yükleyebilirsiniz:

    pip install mysqlclient 
    
  2. bu yüklenmişse, aslında kullanarak veritabanına bağlanmak emin olmak kütüphane. Sanal ortam içinde bir Python kabuğu açın ve (github yılında örnekten) aşağıdakileri yazın:

    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. Bu çalışırsa, sen Flask (0.12 at the moment en son sürümünü çalıştıran emin olun; bu yine zaman içinde sabitlenmiş DEBUG modunda Flask çalışan ile ilgili bazı hatalar olduğu gibi, pip list çalıştırarak kontrol edebilirsiniz.

  4. Burada kesinlikle durum böyle değildir, ancak başka bir akıl sağlığı kontrolü, Flask için kullanmak istediğiniz bağlantı noktasında başka bir işlemin yürütülmediğini doğrulamaktadır.

Yukarıdakilerin hepsi iyi çalışıyorsa, aslında ne olduğunu anlamak için yığın izini biraz görmem gerekir.

+0

Antonio Haro öneriniz için teşekkürler. ama yine de hata veriyor. –

+0

şey veritabanı adı url almak gerekir ve bu veritabanı gibi tatlı nane almaya çalışıyorum = request.url.split ("/") [2] .split (".") [0] onun buradan durdu . –