我的档案中包含以下模型listpull/models.py:
from datetime import datetime from listpull import db class Job(db.Model): id = db.Column(db.Integer, primary_key=True) list_type_id = db.Column(db.Integer, db.ForeignKey('list_type.id'), nullable=False) list_type = db.relationship('ListType', backref=db.backref('jobs', lazy='dynamic')) record_count = db.Column(db.Integer, nullable=False) status = db.Column(db.Integer, nullable=False) sf_job_id = db.Column(db.Integer, nullable=False) created_at = db.Column(db.DateTime, nullable=False) compressed_csv = db.Column(db.LargeBinary) def __init__(self, list_type, created_at=None): self.list_type = list_type if created_at is None: created_at = datetime.utcnow() self.created_at = created_at def __repr__(self): return '<Job {}>'.format(self.id) class ListType(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), unique=True, nullable=False) def __init__(self, name): self.name = name def __repr__(self): return '<ListType {}>'.format(self.name)
我打电话./run.py init,然后./run.py migrate然后./run.py upgrade,我看到迁移文件生成,但其空:
"""empty message Revision ID: 5048d48b21de Revises: None Create Date: 2013-10-11 13:25:43.131937 """ # revision identifiers, used by Alembic. revision = '5048d48b21de' down_revision = None from alembic import op import sqlalchemy as sa def upgrade(): ### commands auto generated by Alembic - please adjust! ### pass ### end Alembic commands ### def downgrade(): ### commands auto generated by Alembic - please adjust! ### pass ### end Alembic commands ###
运行
#!/usr/bin/env python # -*- coding: utf-8 -*- from listpull import manager manager.run()
listpull / init.py
# -*- coding: utf-8 -*- # pylint: disable-msg=C0103 """ listpull module """ from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy from flask.ext.script import Manager from flask.ext.migrate import Migrate, MigrateCommand from mom.client import SQLClient from smartfocus.restclient import RESTClient app = Flask(__name__) app.config.from_object('config') db = SQLAlchemy(app) migrate = Migrate(app, db) manager = Manager(app) manager.add_command('db', MigrateCommand) mom = SQLClient(app.config['MOM_HOST'], app.config['MOM_USER'], app.config['MOM_PASSWORD'], app.config['MOM_DB']) sf = RESTClient(app.config['SMARTFOCUS_URL'], app.config['SMARTFOCUS_LOGIN'], app.config['SMARTFOCUS_PASSWORD'], app.config['SMARTFOCUS_KEY']) import listpull.models import listpull.views
更新
如果我通过运行shell ./run.py shell,然后执行do from listpull import *和call db.create_all(),那么将获得以下架构:
shell ./run.py shell
do from listpull import *
call db.create_all()
mark.richman@MBP:~/code/nhs-listpull$ sqlite3 app.db -- Loading resources from /Users/mark.richman/.sqliterc SQLite version 3.7.12 2012-04-03 19:43:07 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .schema CREATE TABLE job ( id INTEGER NOT NULL, list_type_id INTEGER NOT NULL, record_count INTEGER NOT NULL, status INTEGER NOT NULL, sf_job_id INTEGER NOT NULL, created_at DATETIME NOT NULL, compressed_csv BLOB, PRIMARY KEY (id), FOREIGN KEY(list_type_id) REFERENCES list_type (id) ); CREATE TABLE list_type ( id INTEGER NOT NULL, name VARCHAR(80) NOT NULL, PRIMARY KEY (id), UNIQUE (name) ); sqlite>
不幸的是,迁移仍然无法进行。
当你调用migrate命令Flask-Migrate(或实际上在其下的Alembic)时,它将查看你的命令models.py并将其与数据库中的实际值进行比较。
migrate
models.py
你的迁移脚本为空的事实表明,你已通过Flask-Migrate无法控制的另一种方法(可能是通过调用Flask-SQLAlchemy的方法)更新了数据库以匹配你的模型db.create_all()。
db.create_all()
如果你的数据库中没有任何有价值的数据,请打开Python Shell并调用db.drop_all()以清空它,然后再次尝试自动迁移。
Python Shell
db.drop_all()
更新:我在这里安装了你的项目,并确认迁移对我来说工作正常:
(venv)[miguel@miguel-linux nhs-listpull]$ ./run.py db init Creating directory /home/miguel/tmp/mark/nhs-listpull/migrations...done Creating directory /home/miguel/tmp/mark/nhs-listpull/migrations/versions...done Generating /home/miguel/tmp/mark/nhs-listpull/migrations/script.py.mako...done Generating /home/miguel/tmp/mark/nhs-listpull/migrations/env.pyc...done Generating /home/miguel/tmp/mark/nhs-listpull/migrations/env.py...done Generating /home/miguel/tmp/mark/nhs-listpull/migrations/README...done Generating /home/miguel/tmp/mark/nhs-listpull/migrations/alembic.ini...done Please edit configuration/connection/logging settings in '/home/miguel/tmp/mark/nhs-listpull/migrations/alembic.ini' before proceeding. (venv)[miguel@miguel-linux nhs-listpull]$ ./run.py db migrate INFO [alembic.migration] Context impl SQLiteImpl. INFO [alembic.migration] Will assume non-transactional DDL. INFO [alembic.autogenerate] Detected added table 'list_type' INFO [alembic.autogenerate] Detected added table 'job' Generating /home/miguel/tmp/mark/nhs- listpull/migrations/versions/48ff3456cfd3_.py...done
尝试重新签出,我认为你的设置正确。
确保将模型导入manage.py文件(或带有迁移实例的文件)中。即使没有显式使用模型,也必须将模型导入文件中。Alembic需要这些导入来迁移并在数据库中创建表。例如:
manage.py
# ... some imports ... from api.models import User, Bucketlist, BucketlistItem # Import the models app = create_app('dev') manager = Manager(app) migrate = Migrate(app, db) manager.add_command('db', MigrateCommand) # ... some more code here ... if __name__ == "__main__": manager.run() db.create_all()