标签: alembic

对alembic.ini使用不同的.ini文件

我正在尝试为我的Pyramid项目配置SQLAlchemy Alembic,我想使用我的developement.ini(或production.ini)进行Alembic的配置设置.是否可以在Alembic中的任何地方指定我想使用的.ini文件?

python pyramid alembic

11
推荐指数
1
解决办法
2818
查看次数

如何让alembic在after_create上发出自定义DDL?

我有几个我想在create table之后运行的自定义DDL语句:

update_function = DDL("""                                                                                                                                                       
CREATE OR REPLACE FUNCTION update_timestamp()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = now();
    RETURN NEW;
END;
$$ language 'pgplsql';
""")

update_trigger = DDL("""
CREATE TRIGGER update %(table)s_timestamp BEFORE UPDATE
ON %(table)s FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
""")
Run Code Online (Sandbox Code Playgroud)

而且我像这样附上他们:

event.listen(Session.__table__, 'after_create', update_function)
event.listen(Session.__table__, 'after_create', update_trigger)
Run Code Online (Sandbox Code Playgroud)

当我这样做时create_all,我得到了我期望的SQL:

CREATE OR REPLACE FUNCTION update_timestamp()
RETURNS TRIGGER AS $$ 
BEGIN
    NEW.updated_at = now();
    RETURN NEW;
END;
$$ language 'pgplsql';


CREATE TRIGGER update session_timestamp BEFORE UPDATE
ON session …
Run Code Online (Sandbox Code Playgroud)

postgresql ddl sqlalchemy alembic

11
推荐指数
2
解决办法
2325
查看次数

将命名约定添加到现有数据库

我正在使用sqlalchemy,我正在尝试将alembic集成到数据库迁移中.

我的数据库目前存在,并且定义了许多没有名称的ForeignKeys.我想添加一个命名约定,以允许影响ForeignKey列的迁移.

我已将此处给出的命名约定添加到models.py文件的顶部: SQLAlchemy Naming Constraints

convention = {
      "ix": 'ix_%(column_0_label)s',
      "uq": "uq_%(table_name)s_%(column_0_name)s",
      "ck": "ck_%(table_name)s_%(constraint_name)s",
      "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
      "pk": "pk_%(table_name)s"
              }

DeclarativeBase = declarative_base()


DeclarativeBase.metadata = MetaData(naming_convention=convention)

def db_connect():
   return create_engine(URL(**settings.DATABASE))

def create_reviews_table(engine):
    DeclarativeBase.metadata.create_all(engine)

class Review(DeclarativeBase):

    __tablename__ = 'reviews'

    id = Column(Integer, primary_key=True)
    review_id = Column('review_id', String, primary_key=True)
    resto_id = Column('resto_id', Integer, ForeignKey('restaurants.id'),
            nullable=True)
    url = Column('url', String),
    resto_name = Column('resto_name', String)
Run Code Online (Sandbox Code Playgroud)

我根据教程说明设置了alembic/env.py,将模型的元数据提供给target_metadata.

我跑的时候

$: alembic current
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:sqlalchemy.exc.InvalidRequestError:包含%(constraint_name)标记的命名约定要求明确命名约束.

在文档中,他们说"即使我们只使用Column.unique标志,这个相同的功能[使用命名约定生成列的名称]也会生效:" 1,所以我认为应该没有问题(他们继续使用一个未命名的ForeignKey给出一个例子.

我是否需要返回并为所有约束提供明确的名称,或者是否有办法自动执行此操作?

python sqlalchemy alembic

11
推荐指数
3
解决办法
2224
查看次数

alembic - 将包资源用作script_location的示例

我试图将Alembic迁移作为python包分发的一部分.由于将安装此发行版,因此Alembic脚本编目目录(包含迁移)将最终复制到python包文件夹.在这种情况下,我如何告诉Alembic在哪里找到这个目录?

在Alembic文档中,它说该migration目录可以在config.ini文件中指定为包引用:

  • script_location - 这是Alembic环境的位置.它通常被指定为文件系统位置,相对或绝对.如果位置是相对路径,则将其解释为相对于当前目录.

(剪断)

为了支持将自身打包为.egg文件的应用程序,也可以将该值指定为包资源,在这种情况下,resource_filename()用于查找文件(0.2.2中的新增内容).任何包含冒号的非绝对URI在此都被解释为资源名称,而不是直接文件名.

文档没有提供进一步的信息或示例.

有没有人成功实现过这个?您如何将migrationscripting_folder变成"包资源"?那么你怎么告诉alembic在哪里找到它?

python sqlalchemy alembic

11
推荐指数
1
解决办法
1231
查看次数

使用Flask-Migrate(Alembic)无法迁移或升级数据库

我一直在使用Flask-Migrate(Alembic)来更新我的数据库.我更新了我的models.py文件,但是我犯了一个错误.我运行了迁移并去升级数据库,但是我收到了这个错误:

sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1215, 'Cannot add foreign key constraint') [SQL: u'\nCREATE TABLE topics (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\t`subjectID` INTEGER, \n\ttopic VARCHAR(150) NOT NULL, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(`subjectID`) REFERENCES subjects (id)\n)\n\n']
Run Code Online (Sandbox Code Playgroud)

我所做的是db.Text取而代之的db.Integer是外键.

当我尝试运行新的迁移时,我得到了这个:

alembic.util.CommandError: Target database is not up to date.
Run Code Online (Sandbox Code Playgroud)

所以现在我被卡住了.我无法升级数据库,也无法运行迁移.我尝试使用以下内容降级到较旧的数据库版本:

python manage.py db downgrade --sql b877018671c:36949b1cca31
Run Code Online (Sandbox Code Playgroud)

但是当我运行时,python manage.py db current我得到了最新的数据库版本,我被困在其中.

有没有解决这个问题?谢谢.

python sqlalchemy flask alembic flask-migrate

11
推荐指数
3
解决办法
2万
查看次数

Python - 使用Setuptools打包Alembic迁移

在Setuptools setup.py文件中打包Alembic迁移文件的正确方法是什么?一切都在我的回购根源中alembic/.

这是一个Python应用程序,而不是库.

我想要的安装流程是有人可以pip install将轮子作为我的应用程序.然后,他们可以通过运行类似的方式来初始化应用程序数据库<app> alembic upgrade --sqlalchemy.url=<db_url>.然后升级将需要a pip install -U,之后他们可以再次运行Alembic命令.

这是非正统的吗?

如果没有,我将如何做到这一点?当然是console_scripts entry_points.但除此之外?

python setuptools alembic

11
推荐指数
2
解决办法
716
查看次数

通过alembic脚本进行并发数据库表索引

是否可以通过alembic脚本为DB表创建并发索引?

我正在使用postgres DB,并且能够在postgres提示符下通过sql命令创建并发表索引.(并行创建索引on();)

但是找不到通过Db migration(alembic)脚本创建相同的方法.如果我们创建普通索引(不是并发),它将锁定DB表,因此不能并行执行任何查询.所以只想知道如何通过alembic(数据库迁移)脚本创建并发索引

python database sqlalchemy postgresql-9.1 alembic

10
推荐指数
2
解决办法
1358
查看次数

Alembic不会在自动生成中添加Cascade信息?

这是我的Budget架构

class Budget(db.Model):
    __tablename__ = 'budgets'
    # noinspection PyRedeclaration
    uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
                  unique=True)
    user_id = Column(GUID(), ForeignKey('users.uuid'), nullable=False)
    user = relationship('User', backref='budgets')
    created_on = Column('created_on', sa.types.DateTime(timezone=True),
                        nullable=False)
Run Code Online (Sandbox Code Playgroud)

BudgetCategories

class BudgetCategory(db.Model):
    __tablename__ = 'budget_categories'
    # noinspection PyRedeclaration
    uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
                  unique=True)
    budget_id = Column(GUID(), ForeignKey('budgets.uuid'), nullable=False)
    budget = relationship('Budget', backref='budgetCategories',
                          cascade="all, delete-orphan", single_parent=True)
    category = Column('category', sa.types.String, nullable=True)
    parent_category = Column('parent_category', sa.types.String, nullable=True)
    amount = Column('amount', Numeric(10, 2), nullable=False)
    recurring = Column('recurring', …
Run Code Online (Sandbox Code Playgroud)

python orm sqlalchemy flask-sqlalchemy alembic

10
推荐指数
1
解决办法
4149
查看次数

在事务中运行alembic升级迁移

是否alembic upgrade head在事务内运行以便所有数据库更改成功或失败?如果没有,为什么这样设计?

transactions database-migration alembic

10
推荐指数
2
解决办法
2979
查看次数

flask-migrate不检测模型

我在这里阅读(和观看)Flask-Migrate:https: //realpython.com/blog/python/flask-by-example-part-2-postgres-sqlalchemy-and-alembic/https:// www .youtube.com /手表?ν= YJibNSI-IAE#T = 21

从本教程开始做所有事情:

  • 我启动了一个本地postgres服务器(使用Postgres.App,它在postgresql:// localhost:5432启动服务器)
  • 根据上述教程更新配置
  • 更新了app.py,创建了models.py等.

安装Flask-Migrate并运行后

python manage.py db init
python manage.py db migrate
Run Code Online (Sandbox Code Playgroud)

它应该检测models.py中声明的所有表.

就我而言,它什么都没检测到.而且,根据对教程的评论,这不仅仅是我的情况.那么,我该如何做到这一点呢?

python postgresql flask alembic flask-migrate

10
推荐指数
1
解决办法
4164
查看次数