标签: postgresql-12

Postgresql查询嵌套JSONB字段中的对象

我正在使用PostgreSQL 9.6,我有一个名为"ItemDbModel"的表,其中有两列如下:

No integer,
Content jsonb
Run Code Online (Sandbox Code Playgroud)

说我把很多记录像:

 "No": 2, {"obj":"x","Item": {"Name": "BigDog", "Model": "NamedHusky", "Spec":"red dog"}}
 "No": 4, {"obj":"x","Item": {"Name": "MidDog", "Model": "NamedPeppy", "Spec":"no hair"}}
 "No": 5, {"obj":"x","Item": {"Name": "BigCat", "Model": "TomCat", "Spec":"blue color"}}
Run Code Online (Sandbox Code Playgroud)

如何查询表格:

  1. 记录"Content.Item.Name"包含"Dog" "Content.Item.Spec"包含"red"的记录.
  2. "Content.Item.Name"包含"Dog" "Content.Item.Spec"的记录包含"red".
  3. 记录"Content.Item" 中的任何 json字段包含"dog"的位置.

并按"Content.Item.Name.length"排序?

谢谢!

postgresql json jsonb postgresql-9.6 postgresql-12

16
推荐指数
1
解决办法
9739
查看次数

使用nodejs程序连接时出现错误:connect ECONNREFUSED 127.0.0.1:5432

我在 CentOS 8 机器上设置了一个 postgresql 服务器,并使用该pg库在同一台机器上运行一个 js 程序。

const { Pool } = require('pg')

const pool = new Pool({
    user: process.env.PG_USER,      //postgres user
    host: process.env.PG_ENDPOINT,  //localhost (I also tried 127.0.0.1)
    database: process.env.PG_DB,    //database name to connect to
    password: process.env.PG_PASS,  //postgres user password
    port: process.env.PG_PORT       //5432
});
Run Code Online (Sandbox Code Playgroud)

我正确设置了 pg 池,如果我想将其连接到我的 AWS postgres 服务器(当然,具有正确的端点等),它工作得很好,但是当我尝试让它连接到 postgres 服务器时,我在同一台机器上设置时,出现以下错误:

Error: connect ECONNREFUSED 127.0.0.1:5432
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1146:16) {
  errno: -111,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 5432
}
Run Code Online (Sandbox Code Playgroud)

我按照说明设置 pg_hba.conf 文件以允许密码登录而不是 …

javascript node-postgres postgresql-12 centos8

15
推荐指数
1
解决办法
11万
查看次数

在 PostgreSQL 中创建内存表?

我对内存表的理解是将在内存中创建的表,并且尽可能少地使用磁盘(如果有的话)。我假设我有足够的 RAM 来容纳该表,或者至少是大部分。我不想使用显式函数将表(如 pg_prewarm)加载到内存中,我只想在发出 aCREATE TABLE或时默认情况下表就在那里CREATE TABLE AS select statement,除非内存已满或除非我另有说明。我并不特别关心记录到磁盘。

7年前,有人在这里问过类似的问题PostgreSQL相当于MySQL内存表吗?。它已收到 2 个答复,其中一个有点晚了(4 年后)。

一个答案是创建一个 RAM 磁盘并为其添加一个表空间。或者使用 UNLOGGED 表。或者等待全局临时表。然而,我没有特殊的硬件,我只有普通的 RAM - 所以我不知道如何去做。我可以使用 UNLOGGED 功能,但据我了解,仍然涉及相当多的磁盘交互(这是我试图减少的),并且我不确定表是否会默认加载到内存中。此外,我不明白全局临时空间是如何相关的。我对它们的理解是它们只是可以共享的空间中的桌子。

另一个答案建议使用内存列存储引擎。然后使用函数将所有内容加载到内存中。我对这种方法的问题是,所提到的引擎看起来很旧并且没有维护,我找不到任何其他引擎。另外,我希望我不必明确地诉诸使用“加载到内存”功能,而是默认情况下一切都会发生。

我只是想知道 7 年后如何在 Postgres 12 中获取内存表。

postgresql in-memory in-memory-database postgresql-12

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

Postgresql 分区和 sqlalchemy

SQLAlchemy 文档解释了如何创建分区表。但它没有解释如何创建分区。

所以如果我有这个:

#Skipping create_engine and metadata
Base = declarative_base()

class Measure(Base):
    __tablename__ = 'measures'
    __table_args__ = {
        postgresql_partition_by: 'RANGE (log_date)'
    }
    city_id = Column(Integer, not_null=True)
    log_date = Columne(Date, not_null=True)
    peaktemp = Column(Integer)
    unitsales = Column(Integer)

class Measure2020(Base):
    """How am I suppposed to declare this ? """
Run Code Online (Sandbox Code Playgroud)

我知道我会做的大部分事情SELECT * FROM measures WHERE logdate between XX and YY。但这似乎很有趣。

python postgresql sqlalchemy postgresql-12

11
推荐指数
3
解决办法
3213
查看次数

模板数据库“template1”具有排序规则版本,但无法确定实际的排序规则版本

我刚刚将 Postgres 从 12 升级到 15,但不断收到此错误: template database "template1" has a collation version, but no actual collation version could be determined

这是 Postgres 15 中的 template1 排序规则信息: 在此输入图像描述

有想法该怎么解决这个吗?如果需要更多信息,请告诉我。

谢谢!

更新:

以下是操作系统信息:
发行商 ID:Debian。
描述:Debian GNU/Linux 10(破坏者)。
发布:10。
代号:buster。

我有一个 Postgres docker 容器,所以我用它来升级:https ://github.com/tianon/docker-postgres-upgrade/tree/master/12-to-15

我没有更换机器或升级操作系统。以下是 PG 12 上的 template1 整理信息:

在此输入图像描述

更新2:

所以我做了一些挖掘,结果发现 en_US.utf8 排序规则在 Postgres 12 上的 pg_collat​​ion 表中不存在。但是在 Postgres 15 上,它确实存在于该表中,并且版本为 2.31:

在此输入图像描述

有没有什么办法解决这一问题?

database postgresql collation postgresql-12 postgresql-15

11
推荐指数
2
解决办法
7878
查看次数

带有外键引用的另一个表的值的 PostgreSQL 计算列

我目前正在做一个简单的虚拟项目,以更新我对 SQL 的知识并学习一些新东西:)

我有一个Article包含列的表:

aID, price 
Run Code Online (Sandbox Code Playgroud)

我还有一张桌子Storage

sID, aID, count  
Run Code Online (Sandbox Code Playgroud)

Storage表将 引用aID为外键,计数列表示存储了多少文章。

现在我想value在我的Storage表中添加一列。此列应按 计算Article.price * Storage.count

我在网上搜索后发现你可以计算出这样的列

CREATE TABLE tbl 
(
     int1 INT,
     int2 INT,
     product BIGINT GENERATED ALWAYS AS (int1 * int2) STORED
);
Run Code Online (Sandbox Code Playgroud)

但是我还没有找到如何使用另一个表中的列的示例。

为了在计算中使用引用的 aID 中的价格,我必须做什么?

sql postgresql postgresql-12

10
推荐指数
1
解决办法
1916
查看次数

PostgreSQL:使用复合键对大型表进行查询时性能不佳

我们有一个包含 180m 行、大小为 20 GB 的表。\n表 DDL 为:

\n
create table app.table\n(\n    a_id    integer   not null,\n    b_id    integer   not null,\n    c_id    integer   not null,\n    d_id    integer   not null,\n    e_id    integer   not null,\n    f_id    integer   not null,\n    a_date  timestamp not null,\n    date_added          timestamp,\n    last_date_modified  timestamp default now()\n);\n
Run Code Online (Sandbox Code Playgroud)\n

价值分布:

\n
    \n
  • a_id 的范围是 0-160,000,000
  • \n
  • b_id 有一个值(该表是分区表的单个分区的副本,并且该 ID 恰好是分区键)
  • \n
  • c_id的范围是0-4
  • \n
  • d_id 有一个值(当前)
  • \n
  • e_id 有一个值(当前)
  • \n
\n

主键是复合键:

\n
create table app.table\n(\n    a_id    integer   not null,\n    b_id    integer   not …
Run Code Online (Sandbox Code Playgroud)

sql postgresql postgresql-performance amazon-aurora postgresql-12

10
推荐指数
1
解决办法
825
查看次数

PostgreSQL 12 和 PostGIS 3.0.1:错误:无法访问文件“$libdir/postgis-3”:Linux 上没有这样的文件或目录

Linux Mint 19.2使用以下方法安装了最新的 PostgreSQL 12:

sudo apt-get install postgresql

同样,我使用以下命令安装了最新的 Postgis 3.0.1:

sudo apt-get install postgis

我设置了 postgres 帐户和所有内容,并想创建 PostGIS 的扩展。因此,我还必须安装postgresql-12-postgis-3-scripts,它将 postgis.control 添加到 PostgreSQL 安装中。

然后我连接到我的postgres帐户,创建并初始化了一个test数据库并尝试create extension postgis. 答案是:

ERROR: could not access file "$libdir/postgis-3": No such file or directory

PostgreSQL 和 PostGIS 都是全新安装的。我的计算机上没有损坏的依赖项或旧的 PostgreSQL 片段...我错过了什么?提前致谢。

postgresql postgis postgresql-12

9
推荐指数
2
解决办法
3286
查看次数

Postgres 长时间运行的事务在父分区表上持有锁

TL;DR:我们有长时间运行的导入,它们似乎在父分区表上持有锁,即使没有任何东西直接引用父表。

背景

在我们的系统中,我们有inventoriesinventory_items。库存往往有 200k 左右的物品,对于我们的访问模式来说,使用本机分区对inventory_items表进行分区是有意义的inventory_id(我们使用的是 Postgres 12)。换句话说,每个库存都有自己的 inventory_items 分区表。这是通过以下 DDL 完成的:

CREATE TABLE public.inventory_items (
  inventory_id integer NOT NULL,
  /* ... */
)
PARTITION BY LIST (inventory_id);
Run Code Online (Sandbox Code Playgroud)

在我们的应用程序代码中,当通过 Web 仪表板创建库存时,我们会通过以下方式自动创建分区子 inventory_items 表:

CREATE TABLE IF NOT EXISTS inventory_items_#{inventory_id}
  PARTITION OF inventory_items
  FOR VALUES IN (#{inventory_id});
Run Code Online (Sandbox Code Playgroud)

长期进口工作阻碍创造新库存

这些库存通常每天通过 CSV 或其他方式完全重新加载/重新导入一次,并且这些导入任务有时可能需要一段时间。

我们注意到,当这些长时间导入正在运行时,不可能创建新的清单,因为如上所述,创建清单意味着创建分区子表inventory_items,并且长时间运行的导入和创建分区子表之间存在一些锁争用。网络仪表板中的库存,这很糟糕:我们不能仅仅因为发生了完全不相关的导入就阻止用户创建库存。

导入运行时尝试创建清单时的事件/锁定序列

我在 psql 中使用以下查询来确定谁持有哪些锁:

select pid, relname, mode
from pg_locks l
join pg_class t on l.relation = t.oid
where t.relkind …
Run Code Online (Sandbox Code Playgroud)

database postgresql database-partitioning database-locking postgresql-12

8
推荐指数
1
解决办法
4300
查看次数

如何在 PostgreSQL 中列出表的所有索引及其相应的大小?

我可以查看表中所有索引的总大小

SELECT pg_size_pretty (pg_indexes_size('table_name'));

以及特定索引的大小:

select pg_size_pretty(pg_relation_size('index_name'));,

但我想分别检索一个包含表的每个索引的大小信息的列表(索引大小的列表及其所属的相应索引名称)

postgresql indexing postgresql-12 postgresql-13

8
推荐指数
2
解决办法
7125
查看次数