我遇到的问题几乎是这样的: How to preserve a SQLite database from being reverted after deploying to OpenShift?
我不完全理解他的答案,显然不足以将其应用到我自己的应用程序中,并且由于我无法评论他的答案(没有足够的代表),我想我必须提出自己的问题。
问题是,当推送我的本地文件(不包括数据库文件)时,我在 openshift 上的数据库变成了我本地的数据库(通过服务器所做的所有更改都会恢复)。
我在谷歌上搜索了很多,并且非常了解问题是数据库应该位于其他地方,但我无法完全掌握将其放置在哪里以及如果它位于存储库之外如何部署它。
编辑:快速解决方案:如果您遇到此问题,请尝试使用 rhc ssh appname
连接到您的 openshift 应用程序
然后cp app-root/repo/database.db app-root/data/database.db
如果您有 openshift 数据目录作为对 SQLALCHEMY_DATABASE_URI 的引用。不过,我推荐下面接受的答案!
我已附上我的文件结构,这里有一些相关代码:
配置.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 顶部的注释:
“盒式磁带和持久存储:每次推送时,都会重新创建远程存储库目录中的所有内容。将长期项目(如 sqlite 数据库)存储在 OpenShift 数据目录中,这些项目将在存储库推送之间持续存在。OpenShift数据目录可以通过环境变量 $OPENSHIFT_DATA_DIR 找到。”
您可以保持现有项目结构不变,只需使用部署 Hook 将数据库移动到持久存储。
创建部署操作 Hook (可执行文件).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/