标签: postgresql

将 JSON 数组插入 Postgres 表

第1部分:

我正在使用 Postgres 9.5,我试图弄清楚如何使用 JSON 数组插入 postgres 表。我用以下命令创建了一个表:

CREATE TABLE inputtable (
data_point_id SERIAL PRIMARY KEY NOT NULL,
chart_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
properties jsonb NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

json 数据格式如下所示:

[
    { col1: a, col2: 5, col3: 1, col4: one},
    { col1: b, col2: 6, col3: 2, col4: two},
    { col1: c, col2: 7, col3: 3, col4: three}
]
Run Code Online (Sandbox Code Playgroud)

由于一些变化,我现在必须能够基于 user_id 每行插入一个 json 对象。最后,我希望输出如下所示:

data_point_id  | chart_id | user_id |  properties
---------------+----------+----------+--------------
    1          |    1     |     1 …
Run Code Online (Sandbox Code Playgroud)

postgresql database-design stored-procedures

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

Postgres 在 conf 中忽略 wal_level 设置

我正在尝试在 Postgres 中配置复制,并遇到服务器忽略wal_level配置文件中的设置的问题。

我在配置文件中设置:

wal_level = hot_standby
max_wal_senders = 5

但是,当我开始启动 Postgres 时,我遇到了错误:

WAL 流(max_wal_senders > 0)需要 wal_level “archive”、“hot_standby”或“logical”

如果我设置了max_wal_senders = 0,服务器启动正常,但是在 psql 中运行“show all”会显示wal_level = minimal.

 -bash-4.2$ grep wal_level postgresql.conf
wal_level = hot_standby # 最小、存档、hot_standby 或逻辑

-bash-4.2$ psql -c 'show "wal_level";'
 wal_level
-----------
 最小的

知道为什么会忽略配置值吗?

Postgres 错误日志中没有什么值得注意的:

Oct 13 11:03:53 postgres[12324]: [3-1] LOG:数据库系统在 2016-10-13 10:55:35 UTC 关闭
10 月 13 日 11:03:53 postgres[12324]:[4-1] 日志:Mu​​ltiXact 成员环绕保护现已启用
10 月 13 日 11:03:53 postgres[12328]:[3-1] 日志:autovacuum 启动器启动 …

postgresql postgresql-9.5

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

PostgreSQL 查询重构

我有一个简单的表叫做事件

它有日期、开始时间、结束时间和状态

我在同一日期有多个事件,开始和结束。

要知道是否有人可以预约,我必须检查该日期和开始,结束我是否有一条状态为假(未占用)的行。

带有一些示例代码的表定义:

CREATE SEQUENCE events_id_seq;

CREATE TABLE events(
  id int4 NOT NULL DEFAULT nextval('events_id_seq'::regclass),
  event_date date NULL,
  status bool NULL DEFAULT false,
  event_start time NULL,
  event_end   time NULL
) ;

INSERT INTO events(event_date,status,event_start,event_end)
VALUES
('2016-10-10', TRUE, '08:00:00','08:30:00'),
('2016-10-10', TRUE, '08:00:00','08:30:00'),
('2016-10-10', FALSE, '08:00:00','08:30:00'),
('2016-10-10', TRUE, '08:00:00','08:30:00'),
('2016-10-10', TRUE, '08:30:00','09:00:00'),
('2016-10-10', FALSE, '08:30:00','09:00:00'),
('2016-10-10', FALSE, '08:30:00','09:00:00'),
('2016-10-10', FALSE, '08:30:00','09:00:00');

select distinct event_date, event_start, event_end, (
    select count(*) from events e1
    where 
        e1.status = false and
        e1.event_date = e.event_date …
Run Code Online (Sandbox Code Playgroud)

postgresql query-refactor

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

加速数百万行的计数查询

假设一个充满产品的数据库。一个产品可以恰好属于 1 个集合并且由用户创建。数据库的粗略规模:

  • 产品:52.000.000
  • 收藏:9.000.000
  • 用户:大约 9.000.000

我正在尝试检索用户拥有的产品+集合的数量,以及每个集合中的产品数量(该信息应该在所有 x 天生成并在 ElasticSearch 中编入索引)。

对于用户查询,我目前正在做这样的事情:

      SELECT
        users.*,
        (SELECT
          count(*)
        FROM
          products product
        WHERE
          product.user_id = user.id
        ) AS product_count,
        (SELECT
          count(*)
        FROM
          collections collection
        WHERE
          collection.user_id = user.id
        ) AS collection_count
      FROM
        users user
Run Code Online (Sandbox Code Playgroud)

所有 *_id 字段都已编入索引。使用解释(分析,详细)(删除敏感信息):

 Limit  (cost=0.00..156500.97 rows=100 width=41) (actual time=0.064..28345.363 rows=100 loops=1)
   Output: (...), ((SubPlan 1)), ((SubPlan 2))
   ->  Seq Scan on public.users user  (cost=0.00..14549429167.11 rows=9296702 width=41) (actual time=0.064..28345.241 rows=100 loops=1)
         Output: (...), (SubPlan 1), (SubPlan 2)
         SubPlan 1 …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index count postgresql-performance

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

Postgres:了解生成的 WAL 文件数量/大小

我经常惊讶于某些操作如何为我生成大量WAL 文件。

我想要这些 WAL 文件用于时间点恢复(此外,我还执行夜间完全转储)所以需要提供的基本功能,我不想改变它(即我不是在寻找一种方法来打开 WAL存档关闭等)

使用具有以下设置的 Postgres 9.5:

wal_level = archive
checkpoint_timeout = 20min
max_wal_size = 1GB
min_wal_size = 80MB
archive_command = 'test ! -f /backup/wal/%f && cp %p /backup/wal/%f'
Run Code Online (Sandbox Code Playgroud)

我今天运行了这个语句:

WITH table2_only_names AS (
    SELECT id , name FROM table2
)
UPDATE table1
SET table2_name = table2_only_names.name
FROM table2_only_names
WHERE table1.table2_id = table2_only_names.id;
Run Code Online (Sandbox Code Playgroud)

表格1

CREATE TABLE public.table1 (
  id BIGINT PRIMARY KEY NOT NULL DEFAULT nextval('table1_id_seq'::regclass),
  table2_id BIGINT,
  table3_id BIGINT,
  positive_count INTEGER NOT NULL …
Run Code Online (Sandbox Code Playgroud)

postgresql write-ahead-logging

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

pg_dump PostgreSQL 中 .dump 和 .sql 之间的差异

我正在尝试使用 pg_dump 对模式进行备份,例如,

$ pg_dump -U ganapathy -n hotel_management > ganapathy_schema.dump
Run Code Online (Sandbox Code Playgroud)

它创建了备份,但我无法使用pg_restore. 它给出这样的错误,

pg_restore: [archiver] 输入文件似乎不是有效的存档

然后我尝试使用 . sql扩展像,

$ pg_dump -U ganapathy -n hotel_management > ganapathy_schema.sql
Run Code Online (Sandbox Code Playgroud)

但它也给出了同样的错误。

pg_restore: [archiver] 输入文件似乎不是有效的存档

之后,我尝试通过-Fc.dump.sql扩展中指定格式来进行备份。然后我尝试恢复它。它成功恢复。

所以现在我的怀疑是,

PostgreSQL 中 pg_dump 中 .dump 和 .sql 的扩展名有什么区别?

因为两者都需要指定格式。

提前致谢...

postgresql format pg-dump pg-restore

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

PostgreSQL 可信语言列表?

我正在尝试查找 PostgreSQL可信过程语言 (PL)的列表,因为我经常需要在非超级用户环境中使用 PL。

但我找不到确切的答案。例如,这里Postgres 文档表明 perl 有一个受信任和一个不受信任的 PL,这是一种我不太熟悉的语言。这里,它说TRUSTED关键字是您在创建 PL 语言时可以指定的内容,在某些情况下可能会被忽略。

但我也有(可能是错误的)印象,即某些 PL 语言仅受信任(例如 JavaScript PL/V8)或仅不受信任(Python)。其他帖子似乎表明可以调整 pg 以使用以下内容制作甚至是python一种可信赖的语言:

UPDATE pg_language SET lanpltrusted = true WHERE lanname = 'plpythonu';
Run Code Online (Sandbox Code Playgroud)

我的问题比理论更实际。基本上:

是否可以将任何 PL 设置为可信和不可信?

如果不是,可以设置为受信任或受信任的特定语言是什么。

“受信任”是指普通用户在 PL 语言中创建/执行/修改函数时应该具有有效的相同权限。另外,我使用的是 Postgres 9.x)

postgresql security functions postgresql-extensions

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

停止在 pgAdmin 中恢复备份

我目前正在恢复一个数据库,我尝试了三次恢复数据库。第三次我成功了,但不幸的是,其他两次恢复数据库的尝试似乎仍在运行,但从未完成。

我在 pgAdmin 屏幕上有这两个蓝色窗口,我无法删除或停止执行。我尝试了很多东西,我什至卸载了两次PostgreSQL,但恢复窗口又出现了。

我使用的是 Windows 8 和 PostgreSQL 9.6。

在此处输入图片说明

postgresql pgadmin restore postgresql-9.6 pgadmin-4

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

为更新实现“序列号”,而不是日期时间;postgres 专门

所以是一个 postgres 数据库(特别是一个 AmazonRDS 实例 fwiw)。

安排事情以获取任何记录的最后更新(或创建)时间很容易。

该信息将是日期时间。

我想要实现的是:想象一个整数,sequenceNumber,它对数据库来说是原子的和全局的。

简单地说,每个表都会有一个 sequenceNumber 字段。

任何时候任何记录(即,在任何表中)被更新(或创建),它都会获得下一个序列号。

您知道如何拥有对数据库一无所知的程序员朋友。海浪。我的白痴解决方案是,在整个代码库中,每次创建或修改记录时,一定要记得更新它的序列号。(当然,只需要一个全局系统来给出下一个原子序列号。)

对此的声音解决方案是什么?

事实上,它是否已经以某种我不知道的方式完全可用,或者?

postgresql sequence amazon-rds

4
推荐指数
2
解决办法
460
查看次数

如何更改 Postgresql 日志的语言

现在我的数据库在调用我的用户函数时断开连接。我想寻求帮助,但消息是西班牙语。

我如何让我的日志是英文的?我能理解说的是什么,但不知道该怎么做。

或者至少让它正确显示重音字符,如:

terminando la conexión
terminando la conexión
Run Code Online (Sandbox Code Playgroud)

这是我的 pg_log 文件

2016-12-15 17:50:54 VET LOG:  proceso de servidor (PID 19360) fue terminado por una excepción 0xC0000005
2016-12-15 17:50:54 VET DETALLE:  El proceso que falló estaba ejecutando: SELECT * FROM avl_db.process_avl_pool();
2016-12-15 17:50:54 VET HINT:  Vea el archivo «ntstatus.h» para una descripción del valor hexadecimal.
2016-12-15 17:50:54 VET LOG:  terminando todos los otros procesos de servidor activos
2016-12-15 17:50:54 VET WARNING:  terminando la conexión debido a una falla en otro …
Run Code Online (Sandbox Code Playgroud)

postgresql

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