Как использовать файл по умолчанию MySQL (my.cnf) с sqlalchemy? - PullRequest
2 голосов
/ 17 марта 2011

Я бы хотел, чтобы sqlalchemy получил имя хоста, имя пользователя и пароль для базы данных mysql, к которой он подключается.

В документации сказано, что схемы mysql указаны так:

mysql_db =create_engine ('mysql: // scott: tiger @ localhost / foo')

Можно ли вместо этого создать файл по умолчанию для mysql, такой как /etc/my.cnf, и получить оттуда данные для входа?Я хотел бы избежать встраивания имени пользователя / пароля в мой код.

Ответы [ 3 ]

6 голосов
/ 17 марта 2011

Вот результат, найденный в списке рассылки sqlalchemy, опубликованном Томом Х:

http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg11241.html

from sqlalchemy.engine.url import URL

myDB = URL(drivername='mysql', host='localhost',
    database='my_database_name',
    query={ 'read_default_file' : '/path/to/.my.cnf' }
)
engine = create_engine(name_or_url=myDB)
# use the engine as usual, no password needed in your code file :)
3 голосов
/ 21 мая 2014

Если вы хотите использовать MySQLdb, вы можете проанализировать INI-файл с ConfigParser:

sql_ini_fileparser = ConfigParser.RawConfigParser()
sql_ini_fileparser.read('example.cfg')
user = sql_ini_fileparser.get('client', 'user')
password = sql_ini_fileparser.get('client', 'password')
2 голосов
/ 30 мая 2018

Это старый вопрос, но принятый ответ все равно заставляет вас включать имя хоста в виде строки. Я искал решение, которое читает файл 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}')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...