Это старый вопрос, но принятый ответ все равно заставляет вас включать имя хоста в виде строки. Я искал решение, которое читает файл my.cnf
и также получает имя хоста.
Первое, что я нашел, была эта страница и предложение создать URL с помощью ключевого слова query={'read_default_file': 'my.cnf'}
. Следующие действия эквивалентны его ответу, и все они требуют, чтобы вы явно указали имя хоста, но по крайней мере вы можете получить пароли, порты, кодировку и другие данные из файла my.cnf
engine = create_engine('mysql+pymysql://hostname', connect_args={'read_default_file': 'mu.cnf'})
engine = create_engine('mysql+pymysql://hostname?read_default_file=my.cnf')
После прочтения большей части исходного кода, я считаю, что нет никакого способа получить движок sqlalchemy без передачи имени хоста в create_engine.
Так что каким-то образом вы должны получить имя хоста откуда-то еще. Простейшие варианты для этого - использовать переменную окружения, например, host=os.getenv('DATABASE_URI')
, или проанализировать файл конфигурации, используя библиотеку configparser
, как предложил karlo. Я предпочитаю файл конфигурации, потому что тогда вам не нужно вводить имена пользователей и пароли в переменные окружения - вот примерно как pymysql анализирует файл в исходном коде для pymysql.connections.Connection
from configparser import Parser
read_default_group = 'client' # replace this if you're super special
read_default_file = '/etc/my.cnf' # replace this with the path you want to use
cfg = Parser()
cfg.read(defaults_file)
def _config(key, arg=None):
try:
return cfg.get(read_default_group, key)
except Exception:
return arg
user = _config("user")
password = _config("password")
host = _config("host")
database = _config("database")
port = int(_config("port", 3306))
charset = _config("charset", "utf8mb4")
engine = create_engine(f'mysql+pymysql://{user}:{password}@{host}:{port}/{database}?charset={charset}')