Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Alembic—自动生成生成空迁移_Python_Migration_Flask_Flask Sqlalchemy_Alembic - Fatal编程技术网

Python Alembic—自动生成生成空迁移

Python Alembic—自动生成生成空迁移,python,migration,flask,flask-sqlalchemy,alembic,Python,Migration,Flask,Flask Sqlalchemy,Alembic,我第一次尝试使用Alembic,并希望使用--autogenerate功能 我的项目结构看起来像 project/ configuration/ __init__.py dev.py test.py core/ app/ models/ __init__.py

我第一次尝试使用
Alembic
,并希望使用
--autogenerate
功能

我的项目结构看起来像

project/
       configuration/
                    __init__.py
                    dev.py
                    test.py
       core/
           app/
              models/
                    __init__.py
                    user.py
       db/
          alembic/
                  versions/
                  env.py
          alembic.ini
class User(UserMixin, db.Model):
    __tablename__ = 'users'
    # noinspection PyShadowingBuiltins
    uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
                  unique=True)
    email = Column('email', String, nullable=False, unique=True)
    _password = Column('password', String, nullable=False)
    created_on = Column('created_on', sa.types.DateTime(timezone=True),
                        default=datetime.utcnow())
    last_login = Column('last_login', sa.types.DateTime(timezone=True),
                        onupdate=datetime.utcnow())
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import dev


app = Flask(__name__)
app.config.from_envvar('SETTINGS_PT')
db = SQLAlchemy(app)
我正在使用
Flask
SQLAlchemy
及其
Flask-SQLAlchemy
扩展。我的型号
User
看起来像

project/
       configuration/
                    __init__.py
                    dev.py
                    test.py
       core/
           app/
              models/
                    __init__.py
                    user.py
       db/
          alembic/
                  versions/
                  env.py
          alembic.ini
class User(UserMixin, db.Model):
    __tablename__ = 'users'
    # noinspection PyShadowingBuiltins
    uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
                  unique=True)
    email = Column('email', String, nullable=False, unique=True)
    _password = Column('password', String, nullable=False)
    created_on = Column('created_on', sa.types.DateTime(timezone=True),
                        default=datetime.utcnow())
    last_login = Column('last_login', sa.types.DateTime(timezone=True),
                        onupdate=datetime.utcnow())
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import dev


app = Flask(__name__)
app.config.from_envvar('SETTINGS_PT')
db = SQLAlchemy(app)
如上所述,我将
env.py
修改为

from configuration import app

alembic_config = config.get_section(config.config_ini_section)
alembic_config['sqlalchemy.url'] = app.config['SQLALCHEMY_DATABASE_URI']
engine = engine_from_config(
    alembic_config,
            prefix='sqlalchemy.',
            poolclass=pool.NullPool)

其中
配置。\uuuu init\uuuu py
如下所示

project/
       configuration/
                    __init__.py
                    dev.py
                    test.py
       core/
           app/
              models/
                    __init__.py
                    user.py
       db/
          alembic/
                  versions/
                  env.py
          alembic.ini
class User(UserMixin, db.Model):
    __tablename__ = 'users'
    # noinspection PyShadowingBuiltins
    uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
                  unique=True)
    email = Column('email', String, nullable=False, unique=True)
    _password = Column('password', String, nullable=False)
    created_on = Column('created_on', sa.types.DateTime(timezone=True),
                        default=datetime.utcnow())
    last_login = Column('last_login', sa.types.DateTime(timezone=True),
                        onupdate=datetime.utcnow())
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import dev


app = Flask(__name__)
app.config.from_envvar('SETTINGS_PT')
db = SQLAlchemy(app)
现在当我运行迁移时

$alembic revision --autogenerate -m "Added user table"
INFO  [alembic.migration] Context impl PostgresqlImpl.
INFO  [alembic.migration] Will assume transactional DDL.
  Generating /Users/me/IdeaProjects/project/db/alembic/versions/55a9d5
  35d8ae_added_user_table.py...done
但是文件
alembic/versions/55a9d5
有空的
upgrade()
grade()
方法

"""Added user table

Revision ID: 1b62a62eef0d
Revises: None
Create Date: 2013-03-27 06:37:08.314177

"""

# revision identifiers, used by Alembic.
revision = '1b62a62eef0d'
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 ###
为什么它不能理解有一个新的
用户
模型?
请根据@zzzeek提供帮助

,在我的
env.py
中包含以下内容后,我可以使用
--autogenerate
选项

env.py
中的
run\u migrations\u online()

然后我运行了
alembic revision--autogenerate-m“Added initial table”
,得到了

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.create_table('users',
    sa.Column('uuid', sa.GUID(), nullable=False),
    sa.Column('email', sa.String(), nullable=False),
    sa.Column('password', sa.String(), nullable=False),
    sa.Column('created_on', sa.DateTime(timezone=True), nullable=True),
    sa.Column('last_login', sa.DateTime(timezone=True), nullable=True),
    sa.PrimaryKeyConstraint('uuid'),
    sa.UniqueConstraint('email'),
    sa.UniqueConstraint('uuid')
    )
    ### end Alembic commands ###

谢谢你,迈克尔,谢谢你的帮助

我认为值得在此指出的是,我在当前版本(0.8.4)中也遇到了同样的问题,但是设置元数据的方法似乎变得更加明确:除了导入模型之外,还需要设置
target\u metadata
(它出现在
env.py
中,但默认为
None

他们建议导入他们称之为
Base
,但不清楚到底是什么;导入模型从中继承的DeclarativeBase实例对我没有任何帮助(与OP的结果相同)


不过,代码中的实际注释建议使用实际模型(
ModelNameHere.metadata
)设置
target\u元数据,这对我来说确实有效(使用一个模型的元数据会导致检测到所有这些元数据)。

如果不想让flake8抛出未使用的导入错误,然后,您还可以将记录添加到模型文件中的
\uuuuu all\uuuuuuu

在users.py的末尾

__all__ = Users

更多信息,请访问-

您的alembic env.py必须确保它已导入该用户模型,以便在迁移运行时该表出现在内存中。就是这样!非常感谢您的帮助,MichaelCan将非常有用:如果更新列后生成空迁移,请检查此答案不仅需要导入声明性基础,还需要导入从其继承的每个模型。或者添加
#noqa
添加未使用导入的结尾。