首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于flask管理的独立数据库

用于flask管理的独立数据库
EN

Stack Overflow用户
提问于 2020-01-06 18:13:54
回答 1查看 49关注 0票数 2

谁能告诉我,如何使一个单独的数据库只为Flask管理员和可能的flask安全?这就是我使用PostgreSQL数据库的方式,只是为了加载一些表并执行CRUD:

代码语言:javascript
复制
import flask_admin
from flask import Flask
from sqlalchemy import create_engine


app =Flask(__name__)
engine = create_engine{'postgresql://name:password@localhost/tablesdatabase')

我希望为flask-admin创建一个单独的数据库:(这就是我正在尝试的)

代码语言:javascript
复制
admin = flask_admin.Admin(app)

app.config['SQLALCHEMY_BINDS'] = {'admindb' : 'postgresql://name:password@localhost/adminedatabase'}
admin.add_view(ModelView) ? // how can i impelement this ? with a seperate datbase ?
EN

回答 1

Stack Overflow用户

发布于 2021-08-13 09:52:42

没有官方支持,但您可以自定义Flask-SQLalchemy会话以使用不同的连接,这里是使用master slave连接的示例,您可以轻松地添加任意数量的连接

代码语言:javascript
复制
from functools import partial

from sqlalchemy import orm
from flask import current_app
from flask_sqlalchemy import SQLAlchemy, get_state


class RoutingSession(orm.Session):
    def __init__(self, db, autocommit=False, autoflush=True, **options):
        self.app = db.get_app()
        self.db = db
        self._bind_name = None
        orm.Session.__init__(
            self, autocommit=autocommit, autoflush=autoflush,
            bind=db.engine,
            binds=db.get_binds(self.app),
            **options,
        )

    def get_bind(self, mapper=None, clause=None):
        try:
            state = get_state(self.app)
        except (AssertionError, AttributeError, TypeError) as err:
            current_app.logger.info(
                'cant get configuration. default bind. Error:' + err)
            return orm.Session.get_bind(self, mapper, clause)

        # If there are no binds configured, use default SQLALCHEMY_DATABASE_URI
        if not state or not self.app.config['SQLALCHEMY_BINDS']:
            return orm.Session.get_bind(self, mapper, clause)

        # if want to user exact bind
        if self._bind_name:
            return state.db.get_engine(self.app, bind=self._bind_name)
        else:
            # if no bind is used connect to default
            return orm.Session.get_bind(self, mapper, clause)

    def using_bind(self, name):
        bind_session = RoutingSession(self.db)
        vars(bind_session).update(vars(self))
        bind_session._bind_name = name
        return bind_session


class RouteSQLAlchemy(SQLAlchemy):
    def __init__(self, *args, **kwargs):
        SQLAlchemy.__init__(self, *args, **kwargs)
        self.session.using_bind = lambda s: self.session().using_bind(s)

    def create_scoped_session(self, options=None):
        if options is None:
            options = {}
        scopefunc = options.pop('scopefunc', None)
        return orm.scoped_session(
            partial(RoutingSession, self, **options),
            scopefunc=scopefunc,
        )

那么默认的会话将是master,当你想从slave中选择时,你可以直接调用它,这里有示例:

在你的应用中:

代码语言:javascript
复制
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql:///master'
app.config['SQLALCHEMY_BINDS'] = {
    'slave': 'postgresql:///slave'
}

db = RouteSQLAlchemy(app)

从母版中选择

代码语言:javascript
复制
session.query(User).filter_by(id=1).first() 

从从设备中选择

代码语言:javascript
复制
session.using_bind('slave').query(User).filter_by(id=1).first() 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59610217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档