#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 и протестируйте свой способ подключения к этим контейнерам, считывая данные из каждого.