2012-11-07 33 views
9

Tôi đang cố gắng chạy một trang Flask + SQLAlchemy khá đơn giản trên Heroku, nhưng tôi không chắc chắn làm thế nào tôi nên chạy di chuyển của tôi để thiết lập DB của tôi. Khi tôi chạy heroku run alembic upgrade head, tôi nhận được lỗi sau:Tôi nên chạy di chuyển alembic trên Heroku như thế nào?

Running `alembic upgrade head` attached to terminal... up, run.1 
Traceback (most recent call last): 
    File "/app/.heroku/venv/bin/alembic", line 12, in <module> 
    load_entry_point('alembic==0.4.0', 'console_scripts', 'alembic')() 
    File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/config.py", line 255, in main 
    CommandLine(prog=prog).main(argv=argv) 
    File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/config.py", line 250, in main 
    self.run_cmd(cfg, options) 
    File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/config.py", line 241, in run_cmd 
    **dict((k, getattr(options, k)) for k in kwarg) 
    File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/command.py", line 124, in upgrade 
    script.run_env() 
    File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/script.py", line 191, in run_env 
    util.load_python_file(self.dir, 'env.py') 
    File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/util.py", line 185, in load_python_file 
    module = imp.load_source(module_id, path, open(path, 'rb')) 
    File "alembic/env.py", line 80, in <module> 
    run_migrations_online() 
    File "alembic/env.py", line 63, in run_migrations_online 
    poolclass=pool.NullPool) 
    File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/engine/__init__.py", line 349, in engine_from_config 
    return create_engine(url, **opts) 
    File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/engine/__init__.py", line 330, in create_engine 
    return strategy.create(*args, **kwargs) 
    File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/engine/strategies.py", line 64, in create 
    dbapi = dialect_cls.dbapi(**dbapi_args) 
    File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py", line 289, in dbapi 

Đối với tôi, điều này dường như cho thấy nó đang cố gắng để tải thứ sqlite (đó là mặc định tôi có trong alembic.ini), nhưng tôi có những điều sau đây trong env.py của tôi trong nỗ lực sử dụng kết nối Heroku PostgreSQL:

cur_db_uri = config.get_section_option('alembic', 'sqlalchemy.url') 
my_db_uri = app.config.get('SQLALCHEMY_DATABASE_URI', cur_db_uri) 
config.set_section_option('alembic', 'sqlalchemy.url', my_db_uri) 

trong đó app là trường hợp Flask. Tôi đang sử dụng Flask-SQLAlchemy để DRY lên sử dụng DB của tôi trong ứng dụng, và Flask-Heroku để đảm bảo tất cả các biến cấu hình Flask của tôi đang được kéo đúng từ các biến môi trường Heroku.

Trả lời

13

Hóa ra là Flask-Heroku đang kéo giá trị DATABASE_URL, không tồn tại cho ứng dụng của tôi trên Heroku. Thay vào đó, nếu tôi tự ánh xạ giá trị của HEROKU_POSTGRESQL_CRIMSON_URL vào app.config['SQLALCHEMY_DATABASE_URI'], nó hoạt động như mong đợi.

CẬP NHẬT: Và hóa ra tôi đã quên pg:promote DB của tôi để có mặc định cho ứng dụng đó, đó là lý do tại sao DATABASE_URL không tồn tại. Vì vậy, giải pháp thực sự là: đừng quên quảng bá DB của bạn.

UPDATE 2: Hãy để tôi tổng hợp: sử dụng flask-heroku để tiêm đúng SQLALCHEMY_DATABASE_URI vào cấu hình của ứng dụng của bạn, tinh chỉnh env.py để sử dụng ứng dụng của bạn được cấu hình SQLALCHEMY_DATABASE_URI thay vì URL trong alembic.ini, và sau đó chạy nồi cất rượu trên các máy chủ Heroku của qua heroku run alembic upgrade head (hoặc bất kỳ di chuyển nào bạn muốn chạy). Điều này sẽ ngăn bạn không phải chỉnh sửa tệp ini để điều chỉnh cho các môi trường khác nhau (vì môi trường lưu trữ sẽ quản lý nó cho bạn).

+0

Cảm ơn bạn, cảm ơn bạn, cảm ơn bạn. – wheaties

+0

Điều này không hiệu quả đối với tôi, bạn có thể vui lòng giúp tôi, http://stackoverflow.com/questions/17501082/alembic-migrations-for-flask – GangstaGraham