Python Flask Sqlalchemy使用同一模型(类DB.model)绑定多个数据库

Python Flask Sqlalchemy使用同一模型(类DB.model)绑定多个数据库,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我是python/Flask/SQLAlchemy的初学者,如果我的问题很愚蠢,那么很抱歉 我想使用Flask SQLAlchemy通过Flask创建一个API,如下所示: 一个用于用户/密码的sqlite数据库 SQLALCHEMY\u数据库\u URI='0sqlite:////path/to/users.db" 假设我有多个“客户”,用户可以使用 $http POST name=customer1 我需要为每个“客户”创建一个单独的sqlite文件: 我的问题是: 我没有固定数量的“客户”

我是python/Flask/SQLAlchemy的初学者,如果我的问题很愚蠢,那么很抱歉

我想使用Flask SQLAlchemy通过Flask创建一个API,如下所示:

  • 一个用于用户/密码的sqlite数据库

    SQLALCHEMY\u数据库\u URI='0sqlite:////path/to/users.db"

  • 假设我有多个“客户”,用户可以使用

    $http POST name=customer1

  • 我需要为每个“客户”创建一个单独的sqlite文件:
  • 我的问题是:

  • 我没有固定数量的“客户”,因此无法为每个客户创建模型类,也无法为每个客户指定“绑定密钥”。是可以用SQLAlchemy来做这件事,还是我需要用普通的SQLAlchemy

  • 我在data/as customer1.db、customer2.db和customer3.db中有3个“客户”

  • 我将启动应用程序并创建SQLALCHEMY绑定字典,列出data/中的文件,然后根据特定“客户”的请求创建DB.create\u all()

  • 如何使用Flask SQLAlchemy绑定到正确的.db文件 DB.session

    我读过


  • 为什么每个客户都需要完全独立的DB文件

    无论如何,直接炼金术更容易做到这一点。您可以创建一个getter函数,该函数返回指向db文件的会话

    def get_session(customer_id):
        sqlite_url = 'sqlite:////path/customer%s.db' % customer_id
        engine = create_engine(sqlite_url)
    
        # initialize the db if it hasn't yet been initialized
        Base.metadata.create_all(engine)
    
        Session = sessionmaker(bind=engine)
        session = Session()
    
        return session
    
    然后可以使用并关闭该会话


    但是,如果不了解您的具体用例,就很难理解为什么要这样做,而不是只使用一个SQLite数据库。

    您好,Jumbopp,谢谢您的回答。此应用程序将用于不同的站点,以连接到一些服务器并获取一些数据。此应用程序还将由多人使用,以查看数据(1 db)并与其他数据(其他db)进行比较。只需复制数据库文件并将其放在我的数据库目录中,应用程序就可以工作了。我可能最终会有100个db文件。我是SQLAlchemy新手,没有看到使用Flask SQLAlchemy的确切优势,但我确定我想使用它的分页。我不确定我是否可以将它用于您的方法,对吗?您所说的一切都可以在使用关系模式的单个DB文件中更轻松地完成,但是您的调用。普通SQLAlchemy没有分页功能,但是您可以从Flask SQLAlchemy源代码轻松地添加该类。好的,谢谢。从其他问题中,我找到了使用普通SQLAlchemy的不同方法,但我想知道是否可以使用Flask SQLAlchemy和binds,因为我计划使用与Flask SQLAlchemy集成的其他软件包,如Flask Migrate和Flask棉花糖。
    class Customer(DB.Model):
        __tablename__ = 'customer'
        customer_id = DB.Column(DB.Integer, primary_key=True)
        customer_name = DB.Column(DB.String, unique=True, index=True)
    
    SQLALCHEMY_BINDS = {
        'customer1' = 'sqlite:////path/customer1.db',
        'customer2' = 'sqlite:////path/customer2.db',
        ...
    }
    
    
    def get_session(customer_id):
        sqlite_url = 'sqlite:////path/customer%s.db' % customer_id
        engine = create_engine(sqlite_url)
    
        # initialize the db if it hasn't yet been initialized
        Base.metadata.create_all(engine)
    
        Session = sessionmaker(bind=engine)
        session = Session()
    
        return session