我试图将另一个数据库(在同一服务器内)绑定到我的Flask应用程序。我在表上声明了绑定键,并在我的配置中使用了sqlalchemy_bindings,但我仍然得到错误的表不存在于错误的数据库中。下面是我的代码:
class Config(object):
SECRET_KEY = os.environ.get('SECRET_KEY')
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user_name:password@server/serology'
SQLALCHEMY_BINDS = {'ccr': 'mysql+pymysql://user_name:password@server/ccr'}
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
class sample(db.Model):
__bind_key__ = 'ccr'
__tablename__ = "sample"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), nullable=False)
我得到的错误是:
sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1146, "Table 'serology.sample' doesn't exist")
我不明白为什么这不是在数据库中寻找我绑定并声明绑定键的表。任何帮助都是感激的!
对于我来说,当我使用SQLALCHEMY_DATABASE_URI
在常规应用程序连接和使用SQLALCHEMY_BINDS
的其他DB活动之间共享相同的DB会话时,就会发生这种情况。
将它们分开是很重要的,因为__bind_key__
将在会话的第一次实例化时确定。
在我的代码中,我使用(并导入)以下作为方便的每个请求会话工厂:
db_sess = flask_scoped_session(session_factory, app)
对于非主表,我需要构造一个单独的DB会话:
# as part of App initialisation
db = SQLAlchemy()
# in the relevant code block
db.session.query(Non_Primary_DB_Table).filter(...)