标签: sqlalchemy-migrate

是否值得使用sqlalchemy-migrate?

我有一个使用sqlalchemy(在Pylons内)的Web应用程序.我需要有效地更改架构,以便至少每天更改生产版本,可能更多,而不会丢失数据.

我在周末用sqlalchemy-migrate进行了一些玩法,我会说这给我留下了不好的印象.首先,我认为它无法帮助两个数据库引擎之间的迁移 ; 这可能只能通过sqlalchemy完成.其次,文档似乎不是最新的.我不得不更改一些命令行选项,比如在每个命令中给出存储库路径,这可能是迁移的错误.

但最糟糕的是它是"manage.py test "命令.它不仅实际修改了数据库(文档中明确指出了这一点,所以我不能责怪迁移),但是我的第一个迁移脚本只是进行了简单的模式迁移,使升级后的数据库与原始数据库的模式不同.但是"manage.py测试"只回答了类似的问题

 success !
Run Code Online (Sandbox Code Playgroud)

也就是说,它甚至没有检查架构是否处于连贯状态.那么迁移是否值得?S.Lott提出的良好实践相关的"自己动手"方法相比,是否有任何优势?是否有sqlalchemy-migrate的替代方案实际上简化了迁移过程,或者我只是尝试使用先验不好的迁移(那么请告诉我为什么不明显优于创建上面链接中提出的CSV列)?

非常感谢!

python migration data-migration sqlalchemy sqlalchemy-migrate

45
推荐指数
2
解决办法
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万
查看次数

sqlalchemy postgresql枚举不会在db migrate上创建类型

我在Python3下使用Flask开发了一个web应用程序.我在db migrate/upgrade上遇到postgresql枚举类型的问题.

我在模型中添加了一个"状态"列:

class Banner(db.Model):
    ...
    status = db.Column(db.Enum('active', 'inactive', 'archive', name='banner_status'))
    ...
Run Code Online (Sandbox Code Playgroud)

生成的迁移python manage.py db migrate是:

from alembic import op
import sqlalchemy as sa

def upgrade():
    op.add_column('banner', sa.Column('status', sa.Enum('active', 'inactive', 'archive', name='banner_status'), nullable=True))

def downgrade():
    op.drop_column('banner', 'status')
Run Code Online (Sandbox Code Playgroud)

当我这样做时,python manage.py db upgrade我得到一个错误:

...
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) type "banner_status" does not exist
LINE 1: ALTER TABLE banner ADD COLUMN status banner_status

 [SQL: 'ALTER TABLE banner ADD COLUMN status banner_status']
Run Code Online (Sandbox Code Playgroud)

为什么迁移不会创建类型"banner_status"?

我究竟做错了什么?

$ pip freeze
alembic==0.8.6
Flask==0.10.1
Flask-Fixtures==0.3.3
Flask-Login==0.3.2 …
Run Code Online (Sandbox Code Playgroud)

sqlalchemy sqlalchemy-migrate flask flask-sqlalchemy flask-migrate

25
推荐指数
1
解决办法
7065
查看次数

无法完成Flask-Migration

我已经使用SQLAlchemy设置了一个本地Postgres DB,并且无法提交我的第一个条目.我继续犯这个错误......

ProgrammingError: (ProgrammingError) relation "user" does not exist
LINE 1: INSERT INTO "user" (name, email, facebook_id, facebook_token...
Run Code Online (Sandbox Code Playgroud)

看起来这些字段与数据库中的字段不匹配.我正在尝试使用flask-migrate进行迁移,但是,当我运行时,$ python app.py db migrate我收到此错误...

raise util.CommandError("No such revision '%s'" % id_)
alembic.util.CommandError: No such revision '39408d6b248d'
Run Code Online (Sandbox Code Playgroud)

最好删除所有内容并从头开始,因为我似乎已经破坏了我的数据库设置和/或迁移,但我不知道如何.

更新:数据库现在已经开始工作(我删除并再次创建它).但是,我仍然在尝试运行迁移时遇到同样的错误,结果是"没有这样的修订'39408d6b248d'指的是从一个不相关的项目迁移.我重新安装了flask-migrate但同样的错误.

python postgresql sqlalchemy-migrate flask-migrate

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

在Alembic迁移期间更新列内容

假设我的db模型包含一个对象User:

Base = declarative_base() 

class User(Base):                                                               
    __tablename__ = 'users'                                                     

    id = Column(String(32), primary_key=True, default=...) 
    name = Column(Unicode(100))                                             
Run Code Online (Sandbox Code Playgroud)

我的数据库包含一个包含n行的users表.在某些时候,我决定拆分成和,而在我想我的数据迁移以及.namefirstnamelastnamealembic upgrade head

自动生成的Alembic迁移如下:

def upgrade():
    op.add_column('users', sa.Column('lastname', sa.Unicode(length=50), nullable=True))
    op.add_column('users', sa.Column('firstname', sa.Unicode(length=50), nullable=True))

    # Assuming that the two new columns have been committed and exist at
    # this point, I would like to iterate over all rows of the name column,
    # split the string, write it into the new …
Run Code Online (Sandbox Code Playgroud)

sqlalchemy-migrate python-3.x alembic

13
推荐指数
2
解决办法
5330
查看次数

使用sqlalchemy和elixir更新sqlite数据库模式

我创建了一个python应用程序,它使用elixir/sqlalchemy来存储数据.软件的第二个版本要求更新在先前版本中创建的任何文件,以便添加/删除表和列.

我的问题是:我怎样才能做到这一点?我知道sqlalchemy-migrate,但我必须说我发现它令人困惑.它没有提到现有数据会发生什么.此外,sqlite 减少了ALTER TABLE支持,因此如果我尝试删除列,将会迁移什么?有没有其他方法可以使用迁移?

python database sqlalchemy sqlalchemy-migrate python-elixir

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

Flask-Migrate sqlalchemy.exc.NoReferencedTableError:与列关联的外键

我在我的应用程序中使用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('listtype.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, …
Run Code Online (Sandbox Code Playgroud)

sqlalchemy sqlalchemy-migrate flask flask-sqlalchemy flask-migrate

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

如何使用sqlalchemy-migrate编写alter column name migration?

我正在尝试更改列名.首次尝试使用此脚本:

meta = MetaData()

users = Table('users', meta,
    Column('id', Integer, primary_key=True),
    Column('name', String(50), unique=True),
    Column('email', String(120), unique=True)
    )

def upgrade(migrate_engine):
    meta.bind = migrate_engine
    users.c.id.alter(name='id')

def downgrade(migrate_engine):
    meta.bind = migrate_engine
    users.c.id.alter(name='user_id')
Run Code Online (Sandbox Code Playgroud)

migrate.py test在我的开发数据库(源码)的作品也是如此升级和降级.但是当它在Heroku(使用PostgreSQL 8.3)上部署到我的测试环境时,我会在尝试升级时得到一个跟踪.要点就是这个消息:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "id" does not exist 
Run Code Online (Sandbox Code Playgroud)

然后我尝试users.c.user_id在升级方法中使用.在两种环境中都失败了:

AttributeError: user_id
Run Code Online (Sandbox Code Playgroud)

我现在使用的解决方法是这个脚本:

meta_old = MetaData()
meta_new = MetaData()

users_old = Table('users', meta_old,
    Column('user_id', Integer, primary_key=True),
    Column('name', String(50), unique=True),
    Column('email', String(120), unique=True)
    )

users_new = Table('users', meta_new,
    Column('id', Integer, primary_key=True),
    Column('name', String(50), unique=True),
    Column('email', String(120), …
Run Code Online (Sandbox Code Playgroud)

python sqlite postgresql heroku sqlalchemy-migrate

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

Flask数据库问题

我使用本教程作为指导.http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database

我想要有可以产生多个产品的类别.类似于他有多个帖子的用户.

当我打开python解释器并尝试创建一个类别

>>>from app import db, models
>>>u = models.Category(name="Test")
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

/sqlalchemy/orm/properties.py", line 1387, in _generate_backref
self, mapper))
sqlalchemy.exc.ArgumentError: Error creating backref 'category' on relationship 'Category.products': property of that name exists on mapper 'Mapper|Product|product'
Run Code Online (Sandbox Code Playgroud)

所以backref存在问题.在教程中(我已经用他的代码尝试过),他能够使用类似语法的用户.

我甚至尝试使用他的所有文件并创建并迁移了一个新的数据库,我得到了同样的错误.

这是我的models.py文件:

from app import db

WR_IP_NO = 0
WR_IP_YES = 1

class Category(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), unique = True)
    products = db.relationship('Product', backref = 'category', lazy = 'dynamic')

    def __repr__(self):
        return '<Category %r>' % (self.name)

class …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy-migrate flask python-2.7 flask-sqlalchemy

9
推荐指数
1
解决办法
3262
查看次数

在非可空列中忽略默认值

我正在尝试使用以下SQL炼金术脚本在表中创建一个新的布尔值,不可为空的列(默认值为True):

from sqlalchemy import MetaData, Table, Boolean, Column

def upgrade(migrate_engine):
    meta = MetaData(bind=migrate_engine)
    message_table = Table('message', meta, autoload=True)
    col = Column('include_signature', Boolean(), default=True, nullable=False)
    col.create(message_table)
Run Code Online (Sandbox Code Playgroud)

这导致了一个相当令人费解的错误:

  File "src/adhocracy/migration/versions/061_optional_massmessage_signature.py", line 7, in upgrade
    col.create(message_table)
  File "eggs/sqlalchemy_migrate-0.7.2-py2.6.egg/migrate/changeset/schema.py", line 528, in create
    engine._run_visitor(visitorcallable, self, connection, **kwargs)
  File "eggs/SQLAlchemy-0.7.10-py2.6-linux-x86_64.egg/sqlalchemy/engine/base.py", line 2302, in _run_visitor
    conn._run_visitor(visitorcallable, element, **kwargs)
  File "eggs/SQLAlchemy-0.7.10-py2.6-linux-x86_64.egg/sqlalchemy/engine/base.py", line 1972, in _run_visitor
    **kwargs).traverse_single(element)
  File "eggs/sqlalchemy_migrate-0.7.2-py2.6.egg/migrate/changeset/ansisql.py", line 53, in traverse_single
    ret = super(AlterTableVisitor, self).traverse_single(elem)
  File "eggs/SQLAlchemy-0.7.10-py2.6-linux-x86_64.egg/sqlalchemy/sql/visitors.py", line 106, in traverse_single
    return meth(obj, **kw)
  File "eggs/sqlalchemy_migrate-0.7.2-py2.6.egg/migrate/changeset/databases/sqlite.py", …
Run Code Online (Sandbox Code Playgroud)

sqlite sqlalchemy sqlalchemy-migrate

8
推荐指数
1
解决办法
3512
查看次数