Приложение Openshift с флягой, sqlalchemy и sqlite — проблемы с возвратом базы данных

У меня проблема почти такая же: -openshi">Как защитить базу данных SQLite от возврата после развертывания в OpenShift?

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

Проблема в том, что при отправке моих локальных файлов (не включая файл базы данных) моя база данных на openshift становится той, что у меня есть локально (все изменения, сделанные через сервер, отменяются).

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

EDIT: Быстрое решение. Если у вас возникла эта проблема, попробуйте подключиться к приложению openshift с помощью rhc ssh appname, а затем cp app-root/repo/database.db app-root/data/database.db, если у вас есть каталог данных openshift в качестве ссылки на SQLALCHEMY_DATABASE_URI. Тем не менее, я рекомендую принятый ответ ниже!

Я прикрепил свою файловую структуру и вот соответствующий код:

config.py

import os
basedir = os.path.abspath(os.path.dirname(__file__))

SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir,     'database.db')
SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository')

приложение/__ init.py__

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
#so that flask doesn't swallow error messages
app.config['PROPAGATE_EXCEPTIONS'] = True
app.config.from_object('config')
db = SQLAlchemy(app)

from app import rest_api, models

wsgi.py:

#!/usr/bin/env python
import os

virtenv = os.path.join(os.environ.get('OPENSHIFT_PYTHON_DIR', '.'), 'virtenv')

#
# IMPORTANT: Put any additional includes below this line.  If placed above    this
# line, it's possible required libraries won't be in your searchable path
#

from app import app as application

## runs server locally
if __name__ == '__main__':
    from wsgiref.simple_server import make_server
    httpd = make_server('localhost', 4599, application)
    httpd.serve_forever()

файловая структура: http://sv.tinypic.com/r/121xseh/8 ( не могу прикрепить картинку..)


person Yousif Touma    schedule 28.04.2015    source источник
comment
Если вы не отправляете файл базы данных, как он попадает на сервер? Убедитесь, что он находится в .gitignore   -  person nathancahill    schedule 28.04.2015
comment
Я принудительно нажимаю его один раз, а затем все изменения вносятся в тот, который находится в каталоге данных openshift, но, возможно, я был смущен этим.   -  person Yousif Touma    schedule 29.04.2015


Ответы (1)


В примечании в верхней части Руководства по картриджам OpenShift:

«Картриджи и постоянное хранилище: каждый раз, когда вы нажимаете, все в вашем удаленном каталоге репо создается заново. Храните долгосрочные элементы (например, базу данных sqlite) в каталоге данных OpenShift, который будет сохраняться между нажатиями вашего репозитория. Каталог данных OpenShift может можно найти через переменную окружения $OPENSHIFT_DATA_DIR».

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

Создайте хук действия развертывания (исполняемый файл) .openshift/action_hooks/deploy:

#!/bin/bash

# This deploy hook gets executed after dependencies are resolved and the
# build hook has been run but before the application has been started back
# up again.

# if this is the initial install, copy DB from repo to persistent storage directory
if [ ! -f ${OPENSHIFT_DATA_DIR}database.db ]; then
  cp -rf ${OPENSHIFT_REPO_DIR}database.db ${OPENSHIFT_DATA_DIR}/database.db 2>/dev/null
fi

# remove the database from the repo during all deploys
if [ -d ${OPENSHIFT_REPO_DIR}database.db ]; then
  rm -rf ${OPENSHIFT_REPO_DIR}database.db
fi

# create symlink from repo directory to new database location in persistent storage
ln -sf ${OPENSHIFT_DATA_DIR}database.db ${OPENSHIFT_REPO_DIR}database.db

Как указал другой человек, также убедитесь, что вы действительно фиксируете/отправляете свою базу данных (убедитесь, что ваша база данных не включена в ваш .gitignore).

person luciddreamz    schedule 28.04.2015
comment
Спасибо за эту помощь, я понял, как решить эту проблему один раз без этого хука развертывания, но я интегрирую это, так как это поможет мне, если мне по какой-то причине понадобится удалить мою базу данных. Будет ли это работать, если я запущу свой сценарий миграции или мне придется локально удалить базу данных и отправить новую? - person Yousif Touma; 29.04.2015
comment
Да, должно нормально работать со скриптом миграции. После первоначальной установки этот сценарий предотвратит перезапись удаленной базы данных при последующих развертываниях. Вы можете подключиться к своему снаряжению по SSH и удалить базу данных, если по какой-то причине вам когда-нибудь понадобится новый старт, но обычно вы хотите сохранить данные в своей удаленной БД. - person luciddreamz; 01.05.2015