Как инициализировать несколько ядер баз данных при запуске приложения на python-flask?

#python #flask #sqlalchemy #flask-sqlalchemy

#python #фляжка #sqlalchemy #колба-sqlalchemy

Вопрос:

Я работаю над приложением на python-flask, в котором я инициализирую ядра баз данных во время запуска сервера. Вот как мой app.py файл выглядит так.

 import statements
from dbmanager import datasource

app = Flask(__name__)
CORS(app)
app.secret_key = 'bob'
api = Api(app)
HERE = Path(__file__).parent

for api_class_file in HERE.glob("apis/*.py"):
    api_class_name = api_class_file.stem
    api_module = import_module(f"apis.{api_class_name}")
    api_class = getattr(api_module, api_class_name)
    if api_class_name != '__init__':
        api.add_resource(api_class, f"/{api_class_name}".lower())

app.ls_sf_db_env = 'prod'
app.ls_config = config_reader.get_config('prod')

# Initialise the connection pool
datasource.initialize_all_site_engines(app)

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000)
    app.run(debug=True)
 

Я подготовил файл источника данных и использовал SQLAlchemy для создания и инициализации нескольких движков для разных подключений, как показано ниже:

 from flask import current_app
from sqlalchemy import create_engine

site_name = {"AP":"DBAP10", "GL":"DBGL10"}

def lookup(site):
    return current_app.ls_db_connection_pool[site]

def initialize_all_site_engines(app):
    conf, sf_db_env = app.ls_config, app.ls_sf_db_env
    ls_db_connection_pool = {}

    if sf_db_env == 'test':
        engine = create_connection_pool('AP')
        ls_db_connection_pool['AP'] = engine
        ls_db_connection_pool['GL'] = engine
    else:
        ls_db_connection_pool['AP'] = create_connection_pool('AP')
        ls_db_connection_pool['GL'] = create_connection_pool('GL')
    app.ls_db_connection_pool = ls_db_connection_pool

def create_connection_pool(site):
    print(f'Creating Engine for: {site}')
    username = 'username'
    password = 'password'
    host = 'host'
    dbname = site_name[site]
    url = f"mssql pymssql://{username}:{password}@{host}/{dbname}"
    engine = create_engine(url, encoding='utf-8', max_overflow=3, pool_size=5, pool_recycle=3600)
    return engine
 

Если значение sf_db_env не test равно, я инициализирую несколько производственных движков для соответствующих баз данных. В нашем проекте у нас есть несколько сайтов с несколькими базами данных, как показано ниже:
Например: AP это сайт с базой данных: DBAP10 . FS есть сайт с базой данных: DBFS10
Когда я запускаю сервер, python app.py я вижу этот журнал на своем терминале:

 Creating Engine for: DBAP10
engine created for AP
Creating Engine for: DBGL10
engine created for GL
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
2020-12-03 14:38:18,392 - _internal - INFO -  * Running on http://127.0.0.1:5000/ (Press CTRL C to quit)
 

И в моем классе API я использую

 engine = datasource.lookup('AP')
connection = engine.connect()
do_something_with_connection
 

Я не могу протестировать свой код для нескольких сайтов / баз данных, поскольку на данный момент у нас есть только база данных, настроенная для сайта ‘AP’. Но среда с несколькими сайтами появится в 2021 году, и нам сказали настроить параметры подключения как таковые прямо сейчас

Может ли кто-нибудь сообщить мне, правильно ли то, как я создаю несколько движков во время запуска сервера? Любая помощь приветствуется.

Ответ №1:

Ну, я не могу сказать вам, правильный ли способ, которым вы это делаете, но я рекомендую использовать docker / docker-compose для создания некоторых макетов базы данных / сайта и тестирования его самостоятельно.

Комментарии:

1. Я пытаюсь подключиться к нескольким базам данных или создать несколько объектов подключения, в то время как app.py запуски.

2. Создайте несколько контейнеров базы данных перед запуском app.py и протестируйте свой способ подключения к этим контейнерам, считывая данные из каждого.