标签: alembic

如何在Alembic升级脚本中执行插入和更新?

我需要在Alembic升级期间更改数据.

我目前在第一次修订中有一个'玩家'表:

def upgrade():
    op.create_table('player',
        sa.Column('id', sa.Integer(), nullable=False),
        sa.Column('name', sa.Unicode(length=200), nullable=False),
        sa.Column('position', sa.Unicode(length=200), nullable=True),
        sa.Column('team', sa.Unicode(length=100), nullable=True)
        sa.PrimaryKeyConstraint('id')
    )
Run Code Online (Sandbox Code Playgroud)

我想介绍一个'团队'表.我创建了第二个版本:

def upgrade():
    op.create_table('teams',
        sa.Column('id', sa.Integer(), nullable=False),
        sa.Column('name', sa.String(length=80), nullable=False)
    )
    op.add_column('players', sa.Column('team_id', sa.Integer(), nullable=False))
Run Code Online (Sandbox Code Playgroud)

我想第二次迁移也添加以下数据:

  1. 填充团队表:

    INSERT INTO teams (name) SELECT DISTINCT team FROM players;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 根据players.team名称更新players.team_id:

    UPDATE players AS p JOIN teams AS t SET p.team_id = t.id WHERE p.team = t.name;
    
    Run Code Online (Sandbox Code Playgroud)

如何在升级脚本中执行插入和更新?

python sqlalchemy alembic

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

目标数据库不是最新的

我想为Flask应用程序进行迁移.我正在使用Alembic.

但是,我收到以下错误.

Target database is not up to date.
Run Code Online (Sandbox Code Playgroud)

在线,我读到它与此有关. http://alembic.zzzcomputing.com/en/latest/cookbook.html#building-an-up-to-date-database-from-scratch

不幸的是,我不太明白如何让数据库保持最新状态以及我应该在哪里/如何编写链接中给出的代码.如果您有迁移经验,可以帮我解释一下

谢谢

python sqlalchemy flask alembic

56
推荐指数
8
解决办法
4万
查看次数

是否可以将alembic连接字符串存储在alembic.ini之外?

我正在使用Alembic和SQL Alchemy.使用SQL Alchemy,我倾向于遵循一种模式,即我不将连接字符串与版本化代码一起存储.相反,我的文件secret.py包含任何机密信息.我把这个文件名丢给我,.gitignore所以它不会在GitHub上结束.

这种模式工作正常,但现在我开始使用Alembic进行迁移.看来我无法隐藏连接字符串.而是在alembic.ini中,将连接字符串作为配置参数放置:

# the 'revision' command, regardless of autogenerate
# revision_environment = false

sqlalchemy.url = driver://user:pass@localhost/dbname

# Logging configuration
[loggers]
keys = root,sqlalchemy,alembi
Run Code Online (Sandbox Code Playgroud)

我担心我会不小心为我的数据库提交一个包含用户名/密码信息的文件.我宁愿将这个连接字符串存储在一个地方,并避免意外将其提交给版本控制的风险.

我有什么选择?

python sqlalchemy alembic

52
推荐指数
6
解决办法
9538
查看次数

在flask-migrate或alembic迁移中创建种子数据

如何在第一次迁移中插入一些种子数据?如果迁移不是最好的地方,那么最佳做法是什么?

"""empty message

Revision ID: 384cfaaaa0be
Revises: None
Create Date: 2013-10-11 16:36:34.696069

"""

# revision identifiers, used by Alembic.
revision = '384cfaaaa0be'
down_revision = None

from alembic import op
import sqlalchemy as sa


def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.create_table('list_type',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(length=80), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('name')
    )
    op.create_table('job',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('list_type_id', sa.Integer(), nullable=False),
    sa.Column('record_count', sa.Integer(), nullable=False),
    sa.Column('status', sa.Integer(), nullable=False),
    sa.Column('sf_job_id', sa.Integer(), nullable=False),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('compressed_csv', sa.LargeBinary(), nullable=True),
    sa.ForeignKeyConstraint(['list_type_id'], ['list_type.id'], ), …
Run Code Online (Sandbox Code Playgroud)

python flask flask-sqlalchemy alembic flask-migrate

43
推荐指数
4
解决办法
2万
查看次数

Alembic:IntegrityError:添加非可空列时"列包含空值"

我正在向现有表添加列.这个新专栏是nullable=False.

op.add_column('mytable', sa.Column('mycolumn', sa.String(), nullable=False))
Run Code Online (Sandbox Code Playgroud)

当我运行迁移时,它会抱怨:

sqlalchemy.exc.IntegrityError: column "mycolumn" contains null values
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy alembic

42
推荐指数
3
解决办法
1万
查看次数

使用Alembic更改Enum字段

当使用早于9.1的PostgreSQL版本(为枚举添加ALTER TYPE)时,如何在alembic迁移中向Enum字段添加元素?这个 SO问题解释了直接过程,但我不太确定如何使用alembic进行翻译.

这就是我所拥有的:

new_type = sa.Enum('nonexistent_executable', 'output_limit_exceeded',
                   'signal', 'success', 'timed_out', name='status')
old_type = sa.Enum('nonexistent_executable', 'signal', 'success', 'timed_out',
                   name='status')
tcr = sa.sql.table('testcaseresult',
                   sa.Column('status', new_type, nullable=False))


def upgrade():
    op.alter_column('testcaseresult', u'status', type_=new_type,
                    existing_type=old_type)


def downgrade():
    op.execute(tcr.update().where(tcr.c.status==u'output_limit_exceeded')
               .values(status='timed_out'))
    op.alter_column('testcaseresult', u'status', type_=old_type,
                    existing_type=new_type)
Run Code Online (Sandbox Code Playgroud)

不幸的是,上面只ALTER TABLE testcaseresult ALTER COLUMN status TYPE status在升级时产生,基本上什么也没做.

python postgresql sqlalchemy alembic

39
推荐指数
6
解决办法
2万
查看次数

从应用程序内部代码中使用Alembic API

我正在使用SQLite作为我的基于PySide的桌面应用程序的应用程序文件格式(请参阅此处了解为什么要这样做).也就是说,当用户使用我的应用程序时,他们的数据将保存在其计算机上的单个数据库文件中.我正在使用SQLAlchemy ORM与数据库进行通信.

当我发布应用程序的新版本时,我可能会修改数据库架构.我不希望用户每次更改架构时都要丢弃他们的数据,所以我需要将他们的数据库迁移到最新的格式.此外,我创建了大量临时数据库来保存数据的子集,以便与某些外部进程一起使用.我想用alembic创建这些数据库,以便用正确的版本标记它们.

我有几个问题:

  • 有没有办法从我的Python代码中调用alembic?我认为必须使用Popen纯Python模块是很奇怪的,但是文档只是从命令行使用alembic.主要是,我需要将数据库位置更改为用户数据库所在的位置.

  • 如果这不可能,我可以从命令行指定新的数据库位置而不编辑.ini文件吗?这将使调用alembic Popen不是一件大事.

  • 我看到,alembic将其版本信息保存在一个名为的简单表中alembic_version,其中一列被调用version_num,一行指定了版本.我可以alembic_version在我的架构中添加一个表,并在创建新数据库时使用最新版本填充它,这样就没有开销吗?这甚至是个好主意; 我应该使用alembic来创建所有数据库吗?

我的alembic非常适合我在项目目录中使用的单个数据库.我想使用alembic在任意位置方便地迁移和创建数据库,最好是通过某种Python API,而不是命令行.此应用程序也被cx_Freeze冻结,以防有所作为.

谢谢!

python sqlite sqlalchemy alembic

35
推荐指数
5
解决办法
9454
查看次数

sqlalchemy:使用参数绑定执行原始sql

我正在尝试使用带有SQLALchemy的参数(在一个alembic脚本中)运行这个简单的原始sql语句:

from alembic import op

t = {"code": "123", "description": "one two three"}

op.execute("insert into field_tags (id, field_id, code, description) "+
               "values (1,'zasz', :code ,:description')", t)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

sqlalchemy.exc.StatementError: A value is required for bind parameter 
  'description' (original cause: InvalidRequestError: A value is required for 
  bind parameter 'description') "insert into field_tags (id, field_id, code, 
  description) values (1, 'math', 
  %(code)s ,%(description)s)" []
Run Code Online (Sandbox Code Playgroud)

解决方案:

t = {"code": "123", "description": "one two three"}
from sqlalchemy.sql import text

op.get_bind().execute(text("insert into field_tags (id, field_id, code, description) …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy database-migration flask-sqlalchemy alembic

34
推荐指数
1
解决办法
3万
查看次数

alembic util命令错误找不到标识符

我正在尝试使用alembic来处理我项目的本地迁移.它第一次工作,但后来我需要删除文件夹并重新启动.(不要问为什么,我只是必须)我正在按照本教程运行命令

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

没关系.但是当我试着奔跑的时候

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

我收到这个错误:

alembic.util.CommandError: Can't locate revision identified by '31b8ab83c7d'
Run Code Online (Sandbox Code Playgroud)

现在,似乎alembic正在寻找不再存在的修订版.无论如何,让alembic忘记那个文件?或者重新启动比较从无到 - >再次自动生成?

postgresql sqlalchemy-migrate flask-sqlalchemy alembic

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

Alembic:使用USING改变列类型

我正在尝试使用alembic将SQLAlchemy PostgreSQL ARRAY(文本)字段转换为我的一个表列的BIT(vary = True)字段.

该列目前定义为:

cols = Column(ARRAY(TEXT), nullable=False, index=True)
Run Code Online (Sandbox Code Playgroud)

我想将其更改为:

cols = Column(BIT(varying=True), nullable=False, index=True)
Run Code Online (Sandbox Code Playgroud)

默认情况下似乎不支持更改列类型,因此我手动编辑了alembic脚本.这就是我目前所拥有的:

def upgrade():
    op.alter_column(
        table_name='views',
        column_name='cols',
        nullable=False,
        type_=postgresql.BIT(varying=True)
    )


def downgrade():
    op.alter_column(
        table_name='views',
        column_name='cols',
        nullable=False,
        type_=postgresql.ARRAY(sa.Text())
    )
Run Code Online (Sandbox Code Playgroud)

但是,运行此脚本会出现错误:

Traceback (most recent call last):
  File "/home/home/.virtualenvs/deus_lex/bin/alembic", line 9, in <module>
    load_entry_point('alembic==0.7.4', 'console_scripts', 'alembic')()
  File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py", line 399, in main
    CommandLine(prog=prog).main(argv=argv)
  File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py", line 393, in main
    self.run_cmd(cfg, options)
  File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/config.py", line 376, in run_cmd
    **dict((k, getattr(options, k)) for k in kwarg)
  File "/home/home/.virtualenvs/deus_lex/local/lib/python2.7/site-packages/alembic/command.py", line …
Run Code Online (Sandbox Code Playgroud)

postgresql sqlalchemy alembic

31
推荐指数
2
解决办法
1万
查看次数