Приложение Openshift с колба, sqlalchemy и sqlite - проблеми с връщането на базата данни

Имам проблем почти точно като този: Как да предпазя SQLite база данни от връщане след внедряване в OpenShift?

Не разбирам отговора му напълно и очевидно недостатъчно, за да го приложа към собственото си приложение и тъй като не мога да коментирам отговора му (няма достатъчно представител), реших, че трябва да задам собствен въпрос.

Проблемът е, че когато натискам моите локални файлове (без да включвам файла с базата данни), моята база данни на openshift става тази, която имам локално (всички промени, направени през сървъра, се връщат).

Търсих много в Google и до голяма степен разбирам проблема, че базата данни трябва да се намира някъде другаде, но не мога да разбера напълно къде да я поставя и как да я разположа, ако е извън репото.

РЕДАКТИРАНЕ: Бързо решение: Ако имате този проблем, опитайте да се свържете с вашето приложение 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