Alembic具有升级和降级到特定修订的命令,例如在命令行上:
alembic upgrade <target-revision>
Run Code Online (Sandbox Code Playgroud)
和
alembic downgrade <target-revision>
Run Code Online (Sandbox Code Playgroud)
如果您不知道是升级还是降级,是否有一种简单的方法可以迁移到特定修订版?即
alembic migrate <target-revision>
Run Code Online (Sandbox Code Playgroud)
我可以通过查看历史,当前和目标修订来确定方向,但这感觉就像打击图书馆一样.我是否遗漏了某些东西,或者有没有理由不提供开箱即用的东西?
使用SQLModel如何让 alembic 识别以下模型?
from sqlmodel import Field, SQLModel
class Hero(SQLModel, table=True):
id: int = Field(default=None, primary_key=True)
name: str
secret_name: str
age: Optional[int] = None
Run Code Online (Sandbox Code Playgroud)
我一直在研究的一种方法是导入 Alembic 的 SQLalchemy 模型,但查看源代码我找不到如何做到这一点。
如何使 Alembic 与 SQLModel 模型一起使用?
我有oauth secret和oauth key在client表中.现在我将它们移动到oauth credentials将在迁移期间创建的表.Alembic生成以下架构进行升级.
from myapp.models import Client, ClientCredential
from alembic import op
import sqlalchemy as sa
def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.create_table('client_credential',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('created_at', sa.DateTime(), nullable=False),
sa.Column('updated_at', sa.DateTime(), nullable=False),
sa.Column('client_id', sa.Integer(), nullable=False),
sa.Column('key', sa.String(length=22), nullable=False),
sa.Column('secret', sa.String(length=44), nullable=False),
sa.Column('is_active', sa.Boolean(), nullable=False),
sa.ForeignKeyConstraint(['client_id'], ['client.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('key')
)
# Here I need to copy data from table A to newly created Table.
# …Run Code Online (Sandbox Code Playgroud) 我已经问了一个关于如何通过使用检测表的问题(Alembic - sqlalchemy初始迁移)
target_metadata = Base.metadata
Run Code Online (Sandbox Code Playgroud)
对于
alembic revision --autogenerate -m "initial migration"
Run Code Online (Sandbox Code Playgroud)
在我将模型导入env.py文件之后,它似乎工作正常但它没有检测到实际存在的表,因此它创建了包含所有表的迁移文件,例如:
def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.create_table('Brand',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('name', sa.String(), nullable=True),
sa.Column('slug', sa.String(), nullable=True),
sa.Column('date_created', sa.DateTime(), nullable=True),
sa.Column('date_updated', sa.DateTime(), nullable=True),
sa.PrimaryKeyConstraint('id'),
schema='Products'
)
def downgrade():
### commands auto generated by Alembic - please adjust! ###
op.drop_table('ProductFile', schema='Products')
Run Code Online (Sandbox Code Playgroud)
我试过了:
alembic stamp head
Run Code Online (Sandbox Code Playgroud)
但在运行并运行autogenerate命令后,系统再次生成所有模型.
from project.apps.users.models import *
from project.apps.orders.models import *
from project.apps.products.models import *
from project.base …Run Code Online (Sandbox Code Playgroud) 我正在使用两个具有相同名称的python包.
是否有规范或pythonic方式来处理安装两个名称冲突的包?到目前为止,我只是偶尔需要在开发/构建期间使用其中一个软件包,所以我一直在使用一个单独的virtualenv来处理冲突,但它使构建步骤更复杂,我想知道是否没有更好的方法来处理它.
我正在用alembic编写一个迁移,但似乎不可能将server_defaults的值从某个东西改为零.
我的代码:
op.alter_column("foo", sa.Column("bar", sa.DateTime(timezone=False), server_default=None, nullable=True))
Run Code Online (Sandbox Code Playgroud)
如果我在迁移后检查,默认仍然是NOW()
我想将 alembic 添加到现有的 sqlalchemy 使用的项目中,并带有一个有效的生产数据库。我找不到进行“零”迁移的标准方法是什么 == 将数据库设置为现在的迁移(对于设置环境的新开发人员)
目前我已经将 import 声明性基类和使用它的所有模型添加到 env.py ,但第一次alembic -c alembic.dev.ini revision --autogenerate确实创建了现有表。
我需要“伪造”现有安装的迁移 - 使用代码。对于 django ORM,我知道如何进行这项工作,但我找不到使用 sqlalchemy/alembic 执行此操作的正确方法
我想alembic revision --autogenerate用我自己的模型类.正因为如此,我需要将它们导入myproject/alembic/env.py如在文档描述.但即使我尝试了很多变化,这也行不通.
我不确定在哪种情况下(不知道这是否是正确的单词)alembic运行env.py.也许这会导致一些错误.
这是我使用的目录和文件结构.
myproject/
common/
__init__.py
model.py
alembic/
env.py
Run Code Online (Sandbox Code Playgroud)
错误就是那种
from .common import model
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
myproject本身只是一个存储库/工作目录.它不安装到系统中(用pip3,apt-get,easyinstall或其他任何东西).
如何使用Alembic --autogenerate迁移SQL Alchemy模型中未硬编码的多个 Postgres模式?(镜像问题的SQLAlchemy支持Postgres架构,但对于Alembic).
特别是,我们使用Postgres模式来分离共享同一组表的不同客户端.此外,客户端之间存在共享内容的模式.SQL Alchemy模型不了解模式,模式是在运行时使用设置的session.execute("SET search_path TO client1,shared").
默认情况下--autogenerate根本没有帮助,因为它检测到模型中不存在的多个模式,最终删除模式并重新创建默认模式中的每个表.
我真的想使用--autogenerate正确的管道来正确设置模式.关于Alembic的API是否/如何做到这一点的任何建议?
我正在尝试使用sqlalchemy创建一个多列唯一约束,它将由Alembic在其自动升级脚本生成器中获取.
我使用以下方法创建约束:
来自import UniqueConstraint我模型中的sqlalchemy
UniqueConstraint('col1', 'col2', 'number', name='uix_table_col1_col2_col3')
Run Code Online (Sandbox Code Playgroud)
但是,Alembic在自动脚本生成中没有采用这种方法.
我可以通过添加来在Alembic脚本中手动创建它.
op.create_unique_constraint('uq_table_col1_col2_col3', 'table', ['col1', 'col2', 'col3'])
Run Code Online (Sandbox Code Playgroud)
是否有办法让Alembic自动生成?
谢谢您的帮助.
alembic ×10
python ×7
sqlalchemy ×6
database ×1
fastapi ×1
namespaces ×1
pydantic ×1
python-3.x ×1
setuptools ×1
sqlmodel ×1