如何在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
相关产品推荐
相关产品推荐

