SQLAlchemy JSONField实现,用于在SQL中独立于JSON类型支持存储字典。
项目描述
SQLAlchemy-JSONField
SQLAlchemy JSONField实现,用于在SQL中独立于JSON类型支持存储字典。
为什么?
SqlAlchemy为几种数据库类型(目前为PostgreSQL和MySQL)提供了JSON字段支持,以及半工作状态的dict <-> JSON <-> VARCHAR示例,但…在真实场景中,我们有sqlite测试,MySQL/MariaDB/Percona/PostgreSQL的生产,其中一些(现代Oracle MySQL & PostgreSQL)支持JSON,而一些(SQLite、Percona & MariaDB)需要将数据转换为文本(不是VARCHAR)。
此外,数据库和连接器端对Unicode的支持级别不同,因此我们可能对在不同部署之间切换JSON编码感兴趣。
解决方案
SQLAlchemy JSONField具有支持自动在原生JSON和JSON编码数据之间切换的API,并且可以强制执行转换为JSON字符串。
优点
免费软件:Apache许可证
开源:[https://github.com/penguinolog/sqlalchemy_jsonfield](https://github.com/penguinolog/sqlalchemy_jsonfield)
自文档化代码:注释中带有类型的文档字符串
默认使用原生JSON,但允许指定不同的库。
支持多个Python版本
用法
与MariaDB直接使用(示例来自功能测试)
import sqlalchemy_jsonfield
class ExampleTable(Base):
__tablename__ = table_name
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
row_name = sqlalchemy.Column(
sqlalchemy.Unicode(64),
unique=True,
)
json_record = sqlalchemy.Column(
sqlalchemy_jsonfield.JSONField(
# MariaDB does not support JSON for now
enforce_string=True,
# MariaDB connector requires additional parameters for correct UTF-8
enforce_unicode=False
),
nullable=False
)
使用其他JSON库的用法
import sqlalchemy_jsonfield
import ujson
class ExampleTable(Base):
__tablename__ = table_name
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
row_name = sqlalchemy.Column(
sqlalchemy.Unicode(64),
unique=True,
)
json_record = sqlalchemy.Column(
sqlalchemy_jsonfield.JSONField(
enforce_string=True,
enforce_unicode=False,
json=ujson, # Use ujson instead of standard json.
),
nullable=False
)
在PostgreSQL/Oracle MySQL(现代版本)/SQLite(测试)环境中使用时,允许设置 enforce_string=False 并使用原生JSON字段。
测试
该包 sqlalchemy_jsonfield 的主要测试机制是使用 tox。可以通过 tox -l 收集可用的环境。
CI系统
并行使用多个CI系统进行代码检查
GitHub actions:用于检查:PEP8、pylint、bandit、安装可能性和单元测试。
项目详情
下载文件
下载适用于您平台的应用程序。如果您不确定选择哪个,请了解更多关于 安装包 的信息。