我有初始迁移设置,但我想将列从 sqlalchemy.Text 更改为 sqlalchemy.JSON
我关注了这篇文章 https://amercader.net/blog/beware-of-json-fields-in-sqlalchemy/
column_foo = Column(mutable_json_type(dbtype=JSONB, nested=True), nullable=True)
Run Code Online (Sandbox Code Playgroud)
当我运行 alembic autogenerate 时,它无法识别任何更改,因此我手动编写了它:
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import JSONB
...
def upgrade() -> None:
op.alter_column("some_table", "column_foo", existing_type=JSONB(), nullable=True)
def downgrade() -> None:
op.alter_column("some_table", "column_foo", existing_type=sa.TEXT(), nullable=True)
Run Code Online (Sandbox Code Playgroud)
注意:我还在我的 ORM 模块和 ALembic migriaon 脚本中尝试了常规 sqlalchemy.JSON。
#orm script
column_foo = Column(JSON, nullable=True)
#migration script
op.alter_column("some_table", "column_foo", existing_type=sa.JSON(), nullable=True)
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,当我检查 postgres 数据库中的元数据时,我仍然看到 TEXT 类型:
CREATE TABLE public.some_table (
...
column_foo text NULL,
Run Code Online (Sandbox Code Playgroud)
为什么没有说 JSON 作为列类型?
我有一个例子,我有一个 .env 文件,其中包含两个变量:
PROJECT_NAME="dummy"
DB_URL=postgresql+psycopg2://postgres:postgres@postgres:5432/
Run Code Online (Sandbox Code Playgroud)
在我的 config.py 中
class DummyConfig(BaseSettings):
PROJECT: str = Field(...)
DB_URL: str = Field(...)
Run Code Online (Sandbox Code Playgroud)
现在,根据我将运行的项目,PROJECT 变量将发生变化。我想通过连接 PROJECT + DB_URL 创建完整的数据库 url,并且这需要是配置类中的新变量(或在 DB_URL 中)。所以在这个例子中结果将是:
postgresql+psycopg2://postgres:postgres@postgres:5432/dummy
Run Code Online (Sandbox Code Playgroud)
在 Config 类中我想要这样的东西:
class DummyConfig(BaseSettings):
PROJECT: str = Field(...)
DB_URL: str = Field(...) + PROJECT #this is for illustration purpose, I know it does not work
Run Code Online (Sandbox Code Playgroud)
我研究了这篇文章:Pydantic:如何使用一个字段的值来设置其他字段的值?
但我不明白(因为分数低我也不能提问)如何做到这一点。OP正在使用user_dict,我认为它是在代码中的某个地方实例化的。我没有任何字典,我专门通过 .env 文件加载变量。