我有一个应用程序,我想今天为它创建一个新的迁移.我跑的时候
$ alembic revision -m "__name__"
Run Code Online (Sandbox Code Playgroud)
我收到了一条消息
Only a single head is supported. The script directory has multiple heads (due branching), which must be resolved by manually editing the revision files to form a linear sequence.
Run `alembic branches` to see the divergence(s).
Run Code Online (Sandbox Code Playgroud)
运行
alembic branches
Run Code Online (Sandbox Code Playgroud)
什么都没有
我是alembic的新手.有2个开发人员正在使用这个应用程序,我们有2个git分支 - 主和开发(我不确定这是否与它有关).
关于这是什么的任何线索?
我正在尝试运行alembic迁移,当我运行时
alembic revision --autogenerate -m "Added initial tables"
Run Code Online (Sandbox Code Playgroud)
它说不出来
sqlalchemy.exc.ArgumentError: Can't load plugin: sqlalchemy.dialects:driver
Run Code Online (Sandbox Code Playgroud)
数据库网址是
postgresql+psycopg2://dev:passwd@localhost/db
Run Code Online (Sandbox Code Playgroud)
我甚至psycopg2安装在我的virtualenv中
$yolk -l
Flask-Login - 0.1.3 - active
Flask-SQLAlchemy - 0.16 - active
Flask - 0.9 - active
Jinja2 - 2.6 - active
Mako - 0.7.3 - active
MarkupSafe - 0.15 - active
Python - 2.7.2 - active development (/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload)
SQLAlchemy - 0.8.0 - active
Werkzeug - 0.8.3 - active
alembic - 0.4.2 - active
antiorm - 1.1.1 - active …Run Code Online (Sandbox Code Playgroud) 我可以alembic --autogenerate在添加/删除列时使用
.
但是,当我想修改例如200个字符到2000个字符的"url"列时,它不会检测到更改.
如何创建Alembic(使用SQLAlchemy),检测更改并自动生成脚本到我的模型的各种列的"大小",并为PostgreSQL创建"alter_column"命令?
编辑:
为什么不使用alembic自动添加:
op.alter_column('mytable', 'url', type_=sa.String(2000), existing_type=sa.String(length=200), nullable=True)
Run Code Online (Sandbox Code Playgroud) 我创建了一个迁移alembic revision --autogenerate,将它应用到我的开发数据库中alembic upgrade head,然后意识到它不是我想要的.
如何恢复迁移,以便我可以调整它并再试一次?
我有一个表'test',其列'Name'没有约束.ALTER通过给它一个UNIQUE约束我需要这个专栏.我该怎么办?
我应该使用op.alter_column('???')或create_unique_constraint('???')?新列不是create_unique_constraint而不是现有列吗?
我正在尝试将我的Flask项目与Alembic
我的应用程序结构集成
project/
configuration/
__init__.py
dev.py
test.py
core/
# all source code
db/
migrations/
__init__.py
alembic.ini
env.py
versions/
Run Code Online (Sandbox Code Playgroud)
当我尝试从我的db目录运行以下内容时,我明白了
File "migration/env.py", line 55, in run_migrations_online
from configuration import app, db
ImportError: No module named configuration
Run Code Online (Sandbox Code Playgroud)
我尝试了请求一个简单的alembic工作示例中提到的自动生成迁移的解决方案,但它对我不起作用
我env.py run_migrations_online()改变的方法是
def run_migrations_online():
"""Run migrations in 'online' mode.
In this scenario we need to create an Engine
and associate a connection with the context.
"""
import os
import sys
sys.path.append(os.getcwd())
from configuration …Run Code Online (Sandbox Code Playgroud) 我想修改一些数据库数据作为alembic升级的一部分.
我以为我可以在迁移升级中添加任何代码,但以下操作失败:
def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.add_column('smsdelivery', sa.Column('sms_message_part_id', sa.Integer(), sa.ForeignKey('smsmessagepart.id'), nullable=True))
### end Alembic commands ###
from volunteer.models import DBSession, SmsDelivery, SmsMessagePart
for sms_delivery in DBSession.query(SmsDelivery).all():
message_part = DBSession.query(SmsMessagePart).filter(SmsMessagePart.message_id == sms_delivery.message_id).first()
if message_part is not None:
sms_delivery.sms_message_part = message_part
Run Code Online (Sandbox Code Playgroud)
出现以下错误:
sqlalchemy.exc.UnboundExecutionError: Could not locate a bind configured on mapper Mapper|SmsDelivery|smsdelivery, SQL expression or this Session
Run Code Online (Sandbox Code Playgroud)
我真的不明白这个错误.我该如何解决这个问题,或者这样的操作不可能?
我已经阅读了文档,但我无法在任何地方找到相关说明.我尝试删除旧密钥并添加一个新密钥,但这会让我产生错误:
op.drop_constraint('PRIMARY', 'some_table', type_='primary')
op.create_primary_key('PRIMARY', 'some_table', ['col1', 'col2'])
sqlalchemy.exc.OperationalError: (OperationalError) (1025, "Error on rename of ... (errno: 150 - Foreign key constraint is incorrectly formed)") 'ALTER TABLE some_table DROP PRIMARY KEY ' ()
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我无法让Alembic使用db.Model(Flask-SQLAlchemy)而不是使用(Flask-SQLAlchemy)自动生成从更改到类的候选迁移Base.
我已修改env.py为创建我的Flask应用程序,导入所有相关模型,初始化数据库,然后运行迁移:
...
uri = 'mysql://user:password@host/dbname?charset=utf8'
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = uri
app.config['SQLALCHEMY_ECHO'] = True
db.init_app(app)
with app.test_request_context():
target_metadata = db.Model.metadata
config.set_main_option('sqlalchemy.url', uri)
if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()
...
Run Code Online (Sandbox Code Playgroud)
这种方法工作正常drop_all(),create_all()(例如,重新创建单元测试的测试分贝时),但似乎在这种情况下落空.自动生成的版本脚本始终具有空的升级和降级方法,例如,
def upgrade():
### commands auto generated by Alembic - please adjust! ###
pass
### end Alembic commands ###
def downgrade():
### commands auto generated by Alembic - please adjust! ###
pass
### end Alembic commands ###
Run Code Online (Sandbox Code Playgroud)
我的更改包括重命名列,更改列定义等 …
sqlalchemy database-migration flask flask-sqlalchemy alembic
我试图Alembic第一次使用,并希望使用此处--autogenerate描述的功能
我的项目结构看起来像
project/
configuration/
__init__.py
dev.py
test.py
core/
app/
models/
__init__.py
user.py
db/
alembic/
versions/
env.py
alembic.ini
Run Code Online (Sandbox Code Playgroud)
我使用Flask,并SQLAlchemy和他们的Flask-SQLAlchemy扩展.我的模特User看起来像
class User(UserMixin, db.Model):
__tablename__ = 'users'
# noinspection PyShadowingBuiltins
uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
unique=True)
email = Column('email', String, nullable=False, unique=True)
_password = Column('password', String, nullable=False)
created_on = Column('created_on', sa.types.DateTime(timezone=True),
default=datetime.utcnow())
last_login = Column('last_login', sa.types.DateTime(timezone=True),
onupdate=datetime.utcnow())
Run Code Online (Sandbox Code Playgroud)
如上所述这里,我修改env.py的样子
from configuration import app
alembic_config = config.get_section(config.config_ini_section) …Run Code Online (Sandbox Code Playgroud)