小编meh*_*kek的帖子

Alembic:将列更改为 JSON 类型

我有初始迁移设置,但我想将列从 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 作为列类型?

python postgresql sqlalchemy alembic

5
推荐指数
1
解决办法
1818
查看次数

Pydantic 合并两个成员(字段)

我有一个例子,我有一个 .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 文件加载变量。

python environment-variables pydantic

3
推荐指数
1
解决办法
1875
查看次数