2014-09-28 31 views
2

有没有人有成功在pythonanywhere上使用flask-migrate的例子?有没有人有一个简单的例子,说明使用迁移的app.py应该是什么样子?沿着线的东西:如何在pythonanywhere上使用flask-migrate?

from flask import Flask, request, render_template 
from flask.ext.sqlalchemy import SQLAlchemy 
from flask.ext.migrate import Migrate, MigrateCommand 
from flask.ext.script import Manager 
app = Flask(__name__) 
app.secret_key = 'This is really unique and secret' 
app.config['SQLALCHEMY_DATABASE_URI'] = '<whatever>' 
db = SQLAlchemy(app) 
db.create_all() 
manager = Manager(app) 
migrate = Migrate(app, db) 
manager.add_command('db', MigrateCommand) 

我发现,当我尝试运行

python app.py db init 

它不能产生移植信息库。这可能是pythonanywhere的文件权限问题吗?

+0

所以我的问题的一部分是愚蠢的。正如文档中指出的那样,可以简单地使用pip install --user flask-migrate获取所需的扩展名 – 2014-09-28 01:01:01

+0

当您尝试db init时出现什么错误 – Glenn 2014-09-28 09:59:29

+0

没有错误。但是也没有生成迁移脚本。 – 2014-09-28 16:22:01

回答

1

烧瓶移民的作者在这里。

这个想法是,你在你的开发环境中生成你的数据库存储库。您必须将您的存储库与源文件一起提交到源代码管理。

然后,当您在托管服务上安装应用程序时,您只需运行upgrade命令即可创建并迁移到最新版本的数据库。

更新:根据您的意见,你想从头开发一个应用程序。我只是自己测试了一下,并且能够创建一个数据库存储库,创建一个迁移并应用它。我所做的就是启动pythonanywhere bash控制台。这里是我完整的会话的副本:

17:39 ~ $ mkdir dbtest 
17:39 ~ $ cd dbtest 
17:39 ~/dbtest $ virtualenv venv 
New python executable in venv/bin/python2.7 
Also creating executable in venv/bin/python 
Installing setuptools............done. 
Installing pip...............done. 
17:39 ~/dbtest $ . venv/bin/activate 
(venv)17:39 ~/dbtest $ pip install flask flask-migrate 
... 
(venv)17:42 ~/dbtest $ vi dbtest.py 
... (entered flask-migrate example code, see below) 
(venv)17:47 ~/dbtest $ python dbtest.py 
usage: dbtest.py [-?] {shell,db,runserver} ... 

positional arguments: 
    {shell,db,runserver} 
    shell    Runs a Python shell inside Flask application context. 
    db     Perform database migrations 
    runserver   Runs the Flask development server i.e. app.run() 

optional arguments: 
    -?, --help   show this help message and exit 
(venv)17:47 ~/dbtest $ python dbtest.py db init                                                
    Creating directory /home/miguelgrinberg/dbtest/migrations ... done 
    Creating directory /home/miguelgrinberg/dbtest/migrations/versions ... done 
    Generating /home/miguelgrinberg/dbtest/migrations/README ... done 
    Generating /home/miguelgrinberg/dbtest/migrations/alembic.ini ... done 
    Generating /home/miguelgrinberg/dbtest/migrations/env.py ... done 
    Generating /home/miguelgrinberg/dbtest/migrations/script.py.mako ... done 
    Generating /home/miguelgrinberg/dbtest/migrations/env.pyc ... done 
    Please edit configuration/connection/logging settings in '/home/miguelgrinberg/dbtest/migrations/alembic.ini' before proceeding. 
(venv)17:54 ~/dbtest $ python dbtest.py db migrate                                               
INFO [alembic.migration] Context impl SQLiteImpl. 
INFO [alembic.migration] Will assume non-transactional DDL. 
INFO [alembic.autogenerate.compare] Detected added table 'user' 
    Generating /home/miguelgrinberg/dbtest/migrations/versions/1c4aa671e23a_.py ... done 
(venv)17:54 ~/dbtest $ python dbtest.py db upgrade                                               
INFO [alembic.migration] Context impl SQLiteImpl. 
INFO [alembic.migration] Will assume non-transactional DDL. 
INFO [alembic.migration] Running upgrade None -> 1c4aa671e23a, empty message 
(venv)17:55 ~/dbtest $ ls -l 
total 8 
-rw-r--r-- 1 miguelgrinberg registered_users 3072 Sep 28 2014 app.db 
-rwxrwxr-x 1 miguelgrinberg registered_users 511 Sep 28 17:48 dbtest.py 
drwxrwxr-x 3 miguelgrinberg registered_users 100 Sep 28 17:55 migrations 
drwxrwxr-x 6 miguelgrinberg registered_users 52 Sep 28 17:41 venv 

,我用来测试这个示例应用程序低于:

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 
from flask.ext.script import Manager 
from flask.ext.migrate import Migrate, MigrateCommand 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' 

db = SQLAlchemy(app) 
migrate = Migrate(app, db) 

manager = Manager(app) 
manager.add_command('db', MigrateCommand) 

class User(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    name = db.Column(db.String(128)) 

if __name__ == '__main__': 
    manager.run() 

你已经有一个移植信息库创建的任何机会呢?还是数据库?

+0

嗨米格尔。因为我还没有在开发环境中生成迁移脚本(我使用pythonanywhere作为开发环境),所以我不清楚源代码控制是否绝对是迁移的必要条件(或者仅仅是良好的做法)。也许我太快读了O'Reilly书的一部分。 – 2014-09-28 16:21:14

+0

在这种情况下,我所说的“源代码管理”是指将您的迁移文件与您的源代码一起保存。我假设你将应用程序部署到pythonanywhere,而不是直接在那里开发。让我在我的回答中添加其他想法。 – Miguel 2014-09-28 17:37:51

+0

文件“/usr/local/lib/python2.7/dist-packages/alembic/config.py”,第142行,在set_main_option中 self.file_config.set(self.config_ini_section,name,value) 文件“/ usr /lib/python2.7/ConfigParser.py“,第753行,集合 ConfigParser.set(self,section,option,value) 文件”/usr/lib/python2.7/ConfigParser.py“,第396行,在集 raise NoSectionError(section) ConfigParser.NoSectionError:没有部分:'alembic' – 2014-09-29 01:32:34

相关问题