Flask-Migrate不创建表

Mar*_*man 21 python flask flask-sqlalchemy flask-migrate

我在文件中有以下模型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 Code Online (Sandbox Code Playgroud)

我打电话./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 ###
Run Code Online (Sandbox Code Playgroud)

run.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from listpull import manager
manager.run()
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

UPDATE

如果我运行shell ./run.py shell然后执行from listpull import *并调用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> 
Run Code Online (Sandbox Code Playgroud)

不幸的是,迁移仍然无效.

Mig*_*uel 14

当您调用migrate命令Flask-Migrate(或其下面的实际Alembic)时,将查看您的命令models.py并将其与数据库中的实际内容进行比较.

您有一个空的迁移脚本这一事实表明您已经更新了数据库以通过Flask-Migrate控制之外的另一种方法来匹配您的模型,可能是通过调用Flask-SQLAlchemy来实现的db.create_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
Run Code Online (Sandbox Code Playgroud)

尝试新结账,我认为您的设置是正确的.


wcy*_*cyn 13

确保导入manage.py文件中的Models (或包含migrate实例的文件).您必须在文件中导入模型,即使您没有明确使用它们也是如此.Alembic需要迁移这些导入,并在数据库中创建表.例如:

# ... 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()
Run Code Online (Sandbox Code Playgroud)


mat*_*hew 7

我刚遇到类似的问题.我想为遇到这个帖子的其他人分享我的解决方案.对我来说,我把我的模特放在一个包里.例如models/user.py和我尝试过from app.models import *,它没有检测到任何迁移.但是,如果我改变导入到from app.models import user这是可以的,为什么我的项目很年轻,但由于我有更多的模型,批量导入将是更可取的.


Dan*_*any 7

我有同样的问题,但是一个不同的问题引起了它.Flask-migrate工作流包含两个后续命令:

flask db migrate
Run Code Online (Sandbox Code Playgroud)

它产生迁移和

flask db upgrade
Run Code Online (Sandbox Code Playgroud)

适用于迁移.我忘了运行最后一个,并尝试在不应用前一个迁移的情况下开始下一个迁移.


dan*_*dee 5

对于遇到此问题的人来说,我的问题就在于此

db.create_all()

在我的主烧瓶应用程序文件中创建了新表而不知道alembic

只需将其注释掉或完全删除它,这样就不会破坏未来的迁移.

但不像@ Miguel的建议,我没有删除整个数据库(我有重要信息),而是通过删除Flask SQLAlchemy创建的新表然后运行迁移来修复它.

而这次alembic检测到新表并创建了一个正确的迁移脚本