postgres 是 django 官方推荐使用的数据库。为什么使用 postgres 以及 mysql 和 postgres 各有什么优劣不是这篇文章的重点,如果感兴趣可以参考下面这些文章:
What are pros and cons of PostgreSQL and MySQL? With respect to reliability, speed, scalability, and features
PostgreSQL vs MySQL
PostgreSQL Vs. MySQL: Differences In Performance, Syntax, And Features
Why I Choose PostgreSQL Over MySQL/MariaDB
PostgreSQL 与 MySQL 相比,优势何在?
django 的 model有一些只针对于 postgres 的 fields,这篇文章就简要地介绍一下这些 pg specific fields,然后还会追踪到 pg 相对于的 feature(因为这一切都是以 pg 强大的特性作为支持的)。
本文的例子全部来源于django的官方文档。
Field 类型一览:
ArrayField
JSONField
HStoreField
Range Field
ArrayField
定义
class ArrayField(base_field, size=None, **options)
base_field
参数
有一个必选的参数 base_field
,挺好理解,一个 Array 得指定元素类型。所以你可以传入 IntegerField
、 CharField
、 TextField
,但是不能传 ForeignKey
, OneToOneField
, ManyToManyField
。 ArrayField还能实现嵌套列表的功能! 请看下面这个例子:
from django.contrib.postgres.fields import ArrayField
from django.db import models
class ChessBoard(models.Model):
board = ArrayField(
ArrayField(
models.CharField(max_length=10, blank=True),
size=8,
),
size=8,
)
这个会在数据库中生成一个 character varying(10)[]
类型的字段:
可以这样插入数据:
c = ChessBoard()
c.board = [["a", "b", "c"], ["d", "e", "f"]]
c.save()
这里有一点是需要注意的,那就是传入的嵌套列表长度要是一样的,不然会触发异常:
django.db.utils.DataError: multidimensional arrays must have array expressions with matching dimensions
这是因为 pg 本身对于 multidimensional array
类型数据做了这个限制:
上图来源于pg官方文档:8.15. Arrays
size
参数
可选,指定 Array的最大长度。但是事实上pg 并不会做强制限制,如果你插入的列表长度超过了 size
,不会报错,还是能成功执行:
c = ChessBoard()
c.board = [
["a", "b", "c"],
["d", "e", "f"],
["d", "e", "f"],
["d", "e", "f"],
["d", "e", "f"],