使用flask,sqlalchemy和sqlite的Openshift应用程序 - 数据库恢复问题

时间:2015-04-28 08:00:51

标签: python-3.x sqlite flask openshift flask-sqlalchemy

我有一个问题非常像这样: 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的引用。我推荐下面接受的答案!

我已经附加了我的文件结构,这里有一些相关的代码:

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(无法附加图片..)

1 个答案:

答案 0 :(得分:3)

通过OpenShift Cartridge Guide

顶部的注释

"磁带和持久存储:每次推送时,都会重新创建远程repo目录中的所有内容。将长期项目(如sqlite数据库)存储在OpenShift数据目录中,该目录将在您的仓库推送之间持续存在。可以通过环境变量$ OPENSHIFT_DATA_DIR找到OpenShift数据目录。"

您可以按原样保留现有项目结构,只需使用部署挂钩将数据库移动到持久存储。

创建部署操作挂钩(可执行文件).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中)。