我有一个使用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
我正在尝试使用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忘记那个文件?或者重新启动比较从无到 - >再次自动生成?
我在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
我已经使用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但同样的错误.
假设我的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) 我创建了一个python应用程序,它使用elixir/sqlalchemy来存储数据.软件的第二个版本要求更新在先前版本中创建的任何文件,以便添加/删除表和列.
我的问题是:我怎样才能做到这一点?我知道sqlalchemy-migrate,但我必须说我发现它令人困惑.它没有提到现有数据会发生什么.此外,sqlite 减少了ALTER TABLE支持,因此如果我尝试删除列,将会迁移什么?有没有其他方法可以使用迁移?
我在我的应用程序中使用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
我正在尝试更改列名.首次尝试使用此脚本:
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) 我使用本教程作为指导.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) 我正在尝试使用以下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) python ×5
sqlalchemy ×5
flask ×3
postgresql ×3
alembic ×2
sqlite ×2
database ×1
heroku ×1
migration ×1
python-2.7 ×1
python-3.x ×1