Flask-Sqlalchemy具有相同模型的多个数据库(绑定)(类DB.Model)

时间:2016-03-03 12:45:09

标签: python flask sqlalchemy flask-sqlalchemy

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

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

  1. 一个用户/密码的sqlite数据库

    SQLALCHEMY_DATABASE_URI =' sqlite:////path/to/users.db'

  2. class User(DB.Model):
        __tablename__ = 'users'
        id = DB.Column(DB.Integer, primary_key=True)
        username = DB.Column(DB.String(64), index=True)
        password = DB.Column(DB.String(128))
    
    1. 假设我有多个"客户"用户可以使用

      创建的女巫

      $ http POST http://localhost:5000/api/customers/ name = customer1

    2. 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)
      
      1. 我需要为每个"客户"创建一个单独的sqlite文件。 :
      2. SQLALCHEMY_BINDS = {
            'customer1' = 'sqlite:////path/customer1.db',
            'customer2' = 'sqlite:////path/customer2.db',
            ...
        }
        
        

        我的问题是:

        1. 我没有固定数量的"客户"所以我不能为每个创建一个模型类,并指定" bind_key "为每个人。是否可以使用Flask-SQLAlchemy执行此操作,或者我需要使用纯SQLAlchemy?

        2. 我有3"客户"在data / as customer1.db,customer2.db和customer3.db。

        3. 我将启动应用程序并创建SQLALCHEMY_BINDS字典列出数据中的文件/然后DB.create_all()请求特定的"客户"

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

          我已阅读Using different binds in the same class in Flask-SQLAlchemy

1 个答案:

答案 0 :(得分:2)

为什么您希望为每个客户提供完全独立的数据库文件?

在任何情况下,使用直接的SQLAlchemy都会更容易。您可以创建一个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数据库。