重复创建迁移

时间:2018-12-12 07:12:06

标签: python flask flask-sqlalchemy flask-migrate

我已经创建了一些模型,当我运行pageID = driver.find_element_by_xpath("//meta[@property='og:url']").get_attribute("content") 命令时,它会创建迁移文件,所以很好。
python manage.py db migrate命令还会在数据库中创建表。
如果我再次运行python manage.py db upgrade命令,那么它将为我最近升级的那些模型创建迁移文件。
您能帮我解决吗?

2 个答案:

答案 0 :(得分:0)

我认为问题在于manage.py。如果您按照flask-migration网站上的说明进行了操作,并将所有模型存储在此文件中-flask-migration仅获取这些模型并生成迁移并将始终执行。您将标准命令包装在文件中,这就是问题所在。

如果要修复它-将模型存储在另一个目录(或另一个文件)中,请将它们添加到应用程序中并使用命令flask db migrate。在这种情况下,flask-migration仅会在第一次时为模型生成迁移,对于其他人,它将检测到更改并仅针对更改生成迁移。

但请注意,烧瓶迁移不会看到所有更改。来自网站:

  

需要检查和编辑迁移脚本,因为Alembic当前无法检测到您对模型所做的每项更改。特别是,Alembic当前无法检测表名称更改,列名称更改或匿名命名的约束。限制的详细摘要可以在Alembic自动生成文档中找到。

答案 1 :(得分:0)

我遇到了同样的问题,并且已经解决了。

就我而言,获取当前表名存在问题。 (在_autogen_for_tables((alembic / autogenerate / compare.py)中调用get_table_names函数)时

我正在将sqlalchemy与mysql-connector一起使用。 mysql-connector以字节数组形式返回表信息。 所以我暂时改变了以下内容。 (base.py(sqlalchemy / dialects / mysql))

@reflection.cache
def get_table_names(self, connection, schema=None, **kw):
    """Return a Unicode SHOW TABLES from a given schema."""
    if schema is not None:
        current_schema = schema
    else:
        current_schema = self.default_schema_name

    charset = self._connection_charset
    if self.server_version_info < (5, 0, 2):
        rp = connection.execute(
            "SHOW TABLES FROM %s"
            % self.identifier_preparer.quote_identifier(current_schema)
        )
        return [
            row[0] for row in self._compat_fetchall(rp, charset=charset)
        ]
    else:
        rp = connection.execute(
            "SHOW FULL TABLES FROM %s"
            % self.identifier_preparer.quote_identifier(current_schema)
        )

        return [
            row[0]
            for row in self._compat_fetchall(rp, charset=charset)
            if row[1]  == "BASE TABLE"
        ]

@reflection.cache
def get_table_names(self, connection, schema=None, **kw):
    """Return a Unicode SHOW TABLES from a given schema."""
    if schema is not None:
        current_schema = schema
    else:
        current_schema = self.default_schema_name

    charset = self._connection_charset
    if self.server_version_info < (5, 0, 2):
        rp = connection.execute(
            "SHOW TABLES FROM %s"
            % self.identifier_preparer.quote_identifier(current_schema)
        )
        return [
            row[0] for row in self._compat_fetchall(rp, charset=charset)
        ]
    else:
        rp = connection.execute(
            "SHOW FULL TABLES FROM %s"
            % self.identifier_preparer.quote_identifier(current_schema)
        )

        return [
            row[0].decode("utf-8")
            for row in self._compat_fetchall(rp, charset=charset)
            if row[1].decode("utf-8")  == "BASE TABLE"
        ]