小编gli*_*its的帖子

Django ORM在Postgres DB上留下空闲连接

最近,由于数据库连接错误,我的Django应用程序经常崩溃:

OperationalError: FATAL:  sorry, too many clients already
Run Code Online (Sandbox Code Playgroud)

当我进入app数据库时,我发现确实有近100个打开的连接,都有相同的查询(由Django ORM执行)并且全部处于idle状态.

我一直在手动做SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle';但我很困惑为什么会发生这种情况.任何人都可以对这里发生的事情有所了解吗?

我的Django数据库设置不会偏离默认值(我没有定义CONN_MAX_AGE或任何这种性质).

什么可能导致这个?我没有做任何高级Django查询.这可以通过Django设置或者某些PostgreSQL配置来解决吗?任何建议表示赞赏.

django postgresql database-connection django-orm

14
推荐指数
1
解决办法
2049
查看次数

Django + Postgres:将 JSON 字符串作为 JSON 类型直接保存到模型中

我有一个 Django 模型,我想在其中保存无模式的键值元数据,所以我使用django.contrib.postgres.fields.JSONField.

键值数据是 Pandas 系列,默认情况下它不是 JSON 可序列化的(由于 numpy.int64、numpy.float64 类型),所以我使用了 handy series.to_json(),它返回一个已经序列化的 JSON 字符串。

为了将它保存到我的模型中,我运行json.loads了它。但我知道json.dumps当数据保存到 Postgres 时会调用它。

如何避免这种不必要的反序列化/重新序列化步骤?

代码示例:

def create_model(pandas_series):
    mdl = Model()
    metadata = pandas_series.to_json()  # gives a JSON string
    mdl.metadata = json.loads(metadata) # string->dict, then dict->string
    mdl.save()
Run Code Online (Sandbox Code Playgroud)

python django postgresql json pandas

4
推荐指数
1
解决办法
4858
查看次数

从 Postgres 返回 JSON 很慢

我在 Postgres 中有一个带有 JSONB 列的表,表的每一行都包含一个大型 JSONB 对象(约 4500 个键,JSON 字符串在 txt 文件中约为 110 KB)。我想查询这些行并获取整个 JSONB 对象。

查询速度很快——当我运行EXPLAIN ANALYZE或省略 JSONB 列时,它会在 100-300 毫秒内返回。但是当我执行完整查询时,它需要几分钟的时间。对以前版本的数据进行完全相同的查询也很快(每个 JSONB 大约只有一半大)。

一些注意事项:

  • 最终以 Python 形式完成(通过 SQLAlchemy/psycopg2)。我担心查询执行器将 JSONB 转换为 JSON,然后将其编码为文本以便通过网络传输,然后在 Python 端再次进行 JSON 编码。它是否正确?如果是这样,我该如何缓解这个问题?当我选择 JSONB 列时::text,查询速度大约是原来的两倍。

  • 我只需要 JSON 的一小部分(大约 300 个键或 6% 的键)。我尝试了过滤查询中 JSON 输出的方法,但它们对性能造成了进一步的严重影响——最终返回整个对象的速度更快。

postgresql performance jsonb

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