2016-01-29 2 views
0

Я использую SQLAlchemy для подключения к базе данных для моего питона API следующим образом:Connect в динамические параметры базы данных SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:[email protected]/dbname' 

Моя проблема заключается в том, что другие разработчики в этом проекте имеют разные имя пользователя базы данных/пароли. Всякий раз, когда мы нажимаем pull с git, мы должны сбросить значения, чтобы они соответствовали базе данных разработчиков. Есть ли способ, которым мы можем вывести sqlalchemy из файла? Таким образом мы могли бы просто добавить его в .gitignore.

Или есть более простой способ достичь этого?

+0

'os.environ.get (" DB_STRING ", 'mysql: // имя пользователя: пароль @ localhost/dbname')', тогда вы просто устанавливаете переменную окружения ... –

+1

вы можете использовать 'папку экземпляра': https: //exploreflask.com/configuration.html # instance-folder –

+0

@rmn; не знал о папке экземпляра; отлично. –

ответ

1

Вы хотите установить для этого переменную окружения. Поскольку каждая среда уникальна для машины, на которой она работает, каждый член команды будет иметь свою собственную строку подключения, полученную из соответствующей среды. Я покажу пример для оболочки Zsh, но Bash или другие оболочки должны быть эквивалентными.

Создайте файл (если один уже не существует) называется ~/.zshenv

В этом файле, добавьте строку:

export DB_CONNECTION_STRING="mysql://username:[email protected]/dbname" 

Обратите внимание, что не должно быть без пробелов между определение переменной и ее значение (а именно знак равенства не имеют пробелов вокруг него). Это было проблемой для меня на Zsh.

Чтобы применить этот пробег переменной source ~/.zshenv. Он будет автоматически загружаться при перезагрузке, но мы не хотим каждый раз выходить из системы/при изменении переменной varialble. Убедитесь, что переменная была определена путем запуска printenv | grep DB_CONNECTION_STRING.

В колбу, просто определить следующее (не забывая import os сверху):

app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DB_CONNECTION_STRING') 

Использование переменных окружения действительно путь. Я использовал материал жесткого кода, что является плохой практикой и, как вы можете видеть, было бы проблемой даже для чего-то тривиального, как несколько пользователей, подключающихся к одной и той же базе данных.

EDIT: см. Комментарий @ rmn о функциональности флагов папки экземпляра; похоже, является твердой альтернативой переменным среды (конечно, это ограничивается приложением Flask, переменные окружения могут использоваться для чего-либо)

+1

вы должны указать значение по умолчанию для 'os.environ.get', так как это вызовет исключение, если ключ отсутствует ... (или хотя бы напечатать более полезное сообщение об ошибке, чем keyerror) +1, я также думаю переменная окружения - это правильный путь для этого ... –

+0

@JoranBeasley, я вижу вашу точку зрения, но то, что происходит, когда вы устанавливаете значение по умолчанию, состоит в том, что может быть другая база данных (локальная), которая не совпадает с той, которую вы хотите подключиться; В прошлом у меня были проблемы с этим, но ваше предложение абсолютно справедливо. –

0

Альтернативный подход - каждый разработчик может иметь локальные настройки в файле, который игнорируется git, например , local_config.py.

Тогда вы использовать его как это:

try: 
    import local_config 
    app.config['SQLALCHEMY_DATABASE_URI'] = local_config.DB_URI 
except ImportError: 
    print "No Local config, use defaults" 
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:[email protected]/dbname' 

Это может быть полезно, если есть много параметров, чтобы установить.

Вы можете сохранить что-то вроде local_config.py.example в репозитории, где перечислены все параметры. Затем каждый может переименовать его в local_config.py и настроить параметры.

Смежные вопросы