You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask-SQLAlchemy中定义PostgreSQL任意类型数组列?

解决方案

针对你需要存储混合类型(字符串、JSON对象)数组的需求,有两种常用的实现方式,以下是具体代码和说明:

方案一:使用原生JSON类型(推荐)

大多数现代数据库(PostgreSQL、MySQL、SQLite 3.9+)都原生支持JSON类型,Flask-SQLAlchemy可通过db.JSON直接定义这类字段,它能自动将Python的列表/字典序列化为JSON格式存储,读取时再反序列化为Python对象,完美保留混合类型的结构。

修改后的代码:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

class PreannotationPrompts(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True)
    type = db.Column(db.String(100))
    # 使用JSON类型存储混合数组
    prompts = db.Column(db.JSON)

使用示例

# 创建实例并赋值
prompt_obj = PreannotationPrompts(
    name="test_prompts",
    type="mixed",
    prompts=[{"key": "value", "key2": []}, 'Hello', {"key": "value", "key2": []}, 'Hi']
)
db.session.add(prompt_obj)
db.session.commit()

# 查询读取
result = PreannotationPrompts.query.filter_by(name="test_prompts").first()
print(result.prompts)  # 输出原始Python列表,包含字典和字符串

优点:数据库中存储可读的JSON格式,支持跨语言读取,性能稳定,适配绝大多数业务场景。

方案二:使用PickleType(仅限Python环境)

如果你的应用仅在Python生态中运行,也可以用PickleType,它能序列化任意Python对象(包括混合类型列表),但存储的是二进制数据,数据库中无法直接查看内容。

修改后的代码:

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.types import PickleType
db = SQLAlchemy(app)

class PreannotationPrompts(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True)
    type = db.Column(db.String(100))
    # 使用PickleType存储任意Python对象
    prompts = db.Column(PickleType)

使用示例

用法和JSON类型完全一致,直接赋值Python列表即可,SQLAlchemy会自动处理序列化与反序列化。

缺点:存储内容不可读,仅支持Python解析,存在安全风险(加载不可信pickle数据可能触发恶意代码执行)。

内容的提问来源于stack exchange,提问作者Saurav Pathak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:30:55