我有一个非常像这样的问题:
How to preserve a SQLite database from being reverted after deploying to OpenShift?
我不完全理解他的答案,显然不足以将其应用到我自己的应用程序中,而且由于我无法评论他的答案(代表人数不足),所以我认为我必须提出自己的问题。
问题是,当推送本地文件(不包括数据库文件)时,openshift上的数据库将变成我本地的数据库(通过服务器进行的所有更改都将还原)。
我已经在Google上搜索了很多,几乎了解了这个问题,即数据库应该位于其他位置,但是我无法完全掌握该数据库的放置位置以及如果该数据库不在存储库中,则该如何部署。
编辑:快速解决方案:如果您有此问题,请尝试使用rhc ssh appname
连接到openshift应用程序
然后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')
app / __ 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(无法附加图像。)
最佳答案
通过OpenShift Cartridge Guide顶部的注释:
“存储盒和持久性存储:每次推送时,都会在远程repo目录中重新创建所有内容。将长期项(例如sqlite数据库)存储在OpenShift数据目录中,该内容将在两次repo推送之间保持不变。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中不包含数据库)。
关于python-3.x - 带有Flask,SQLAlchemy和SQLite的Openshift应用-数据库还原问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29913677/