标签: postgresql-10

postgres_fdw:可以将数据推送到外部服务器进行加入吗?

假设我有一个类似的查询

select * from remote_table
   join local_table using(common_key)
Run Code Online (Sandbox Code Playgroud)

其中 remote_table 是一个FOREIGN TABLEwithpostgres_fdw并且local_table是一个普通表。

local_table小(100 行)和remote_table大(数百万行)。

看起来远程表被整体拉取并在本地加入,此时将较小的表发送到远程服务器并远程加入会更有效。

有没有办法让 postgres_fdw 做到这一点?

postgresql postgres-fdw postgresql-10

7
推荐指数
1
解决办法
447
查看次数

使用 SQLalchemy for PostgreSQL 消除双引号

我正在尝试将 200 个 SAS XPT 文件导入到我的 PostgreSQL 数据库中:

engine = create_engine('postgresql://user:pwd@server:5432/dbName')
for file in listdir(dataPath):
    name, ext = file.split('.', 1)
    with open(join(dataPath, file), 'rb') as f:
        xport.to_dataframe(f).to_sql(name, engine, schema='schemaName', if_exists='replace', index=False)
    print("Successfully wrote ", file, " to database.")
Run Code Online (Sandbox Code Playgroud)

但是,生成的 SQL 对所有标识符都使用双引号,例如:CREATE TABLE "Y2009"."ACQ_F" ("SEQN" FLOAT(53), "ACD010A" FLOAT(53));。问题是,如果列/表/模式是用引号创建的,那么每次我需要查询它们时,我都必须包含引号,同时使用准确的大小写

我想去掉引号,但我无法自己编写自定义 SQL,因为这些文件各自具有非常不同的结构。

python postgresql sqlalchemy python-3.x postgresql-10

6
推荐指数
1
解决办法
4795
查看次数

手动创建复制插槽以在PostgreSQL 10中发布

我正在尝试从PostgreSQL数据库中获取某些表的更新流。获取所有更新的常规方法如下所示:

您创建一个逻辑复制插槽

pg_create_logical_replication_slot('my_slot', 'wal2json');
Run Code Online (Sandbox Code Playgroud)

并使用pg_recvlogical或进行特殊的SQL查询连接到它。这使您可以从json中的数据库中获取所有操作(如果您使用了wal2json插件或类似工具),然后对该数据执行任何操作。

但是在PostgreSQL 10中,我们具有发布/订阅机制,该机制仅允许我们复制选定的表。这非常方便,因为不会发送大量无用的数据。该过程如下所示:

首先,您创建出版物

CREATE PUBLICATION foo FOR TABLE herp, derp;
Run Code Online (Sandbox Code Playgroud)

然后,您从另一个数据库订阅该出版物

CREATE SUBSCRIPTION mysub CONNECTION <connection stuff> PUBLICATION foo;
Run Code Online (Sandbox Code Playgroud)

这将在后台的主数据库上创建一个复制插槽,并开始侦听更新并将它们提交到第二个数据库的相同表中。如果您的工作是复制一些表,但又想获取原始数据流,那就很好了。

如前所述,该CREATE SUBSCRIPTION查询正在幕后的master数据库上创建一个复制插槽,但是如何在没有订阅的情况下手动创建一个复制插槽,又如何创建另一个数据库呢?这里的文档说:

为此,请单独创建复制插槽(使用具有插件名称pgoutput的函数pg_create_logical_replication_slot)

根据文档,这是可能的,但是pg_create_logical_replication_slot只能创建一个常规的复制插槽。是pgoutput插件负责所有的魔法?如果是,那么将无法使用其他插件(如wal2json出版物)。

我在这里想念什么?

postgresql replication postgresql-10

6
推荐指数
2
解决办法
1314
查看次数

Postgres 命令行 - 清除/删除我正在输入的查询

有没有办法快速删除我一直在输入的整个查询?

需要澄清的是,这将是我仍在输入的查询,而不是当前正在运行的查询。

例如,在 bash 中,您可以按CTRL+C并杀死当前行,例如:

$ typing some comman<CTRL-C>
Run Code Online (Sandbox Code Playgroud)

CTRL+后C,它会停止我之前输入的内容而不执行。

这只是我习惯于快速切换思路的做法(“哦,如果我这样做而不是这样做怎么办?”),但是postgres 终端中的CTRL+只会终止该过程。C

postgresql command-line-interface postgresql-10

6
推荐指数
1
解决办法
3245
查看次数

如何删除配置参数

在 Postgres 中,可以创建您自己的配置参数,例如在会话或事务期间持续存在的“cookie”。

这是这样完成的:

SELECT set_config(setting_name, new_value, is_local)
or
SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }
Run Code Online (Sandbox Code Playgroud)

本地应该仅在事务期间持续存在,但即使在事务之后它也会影响配置参数 - 而不是所述参数无法识别,它现在将被设置为空字符串。

问题

如何在不重新连接的情况下再次无法识别该参数?

这不起作用:

SELECT set_config('settings.myapp.value', null, true);
RESET settings.myapp.value;
Run Code Online (Sandbox Code Playgroud)

这不会返回 NULL,而是给出空字符串:

SELECT current_setting('settings.myapp.value', true);
Run Code Online (Sandbox Code Playgroud)

我当然可以解决这个问题,但我想知道是否可以以某种方式将配置参数的状态恢复到“仅事务”更改之前的状态。

SELECT nullif(current_setting('settings.myapp.value', true), '');
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.6 postgresql-10

6
推荐指数
1
解决办法
2402
查看次数

JPQL的INNER JOIN问题(即使SQL请求正在运行)

"bonjouràtous"(大家好)

我来自这个帖子: 如何用SQL中的另一列选择MAX(列值),DISTINCT的行?

这家伙几乎在我的项目中做了我需要的.事实上,我正在尝试做类似Git的事情:检索上一版本中的所有实例.目前,我有一个表"UM",具有以下属性:

  • int id(主键,自动生成)
  • 字符串名称(可以重复)
  • int版本(1,2,3,[...])
  • 字符串fmr
  • [其他属性,在这种情况下不使用]

我在SQL中也有这个请求(运行良好并检索想要的结果):

SELECT * FROM agrid.um AS u INNER JOIN
        (SELECT u2.name, max(u2.version) AS MaxVersion, u2.fmr
         FROM agrid.um AS u2 WHERE u2.fmr = 'CZ2ABVIMG0000' GROUP BY u2.name, u2.fmr) umVersion
         ON u.name = umVersion.name AND u.version = umVersion.MaxVersion
         WHERE u.fmr = 'ABCDE';
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在JPQL中执行相同操作时,我遇到了一些"JOIN"错误:

TypedQuery<UmEty> q = getManager().getEntityManager().createQuery(
            "SELECT u FROM UmEty u INNER JOIN"
            + " (SELECT u2.name, max(u2.version) AS MaxVersion, u2.fmr "
            + " FROM UmEty u2 WHERE u2.fmr = :fmr …
Run Code Online (Sandbox Code Playgroud)

java jpa jpql postgresql-10

6
推荐指数
1
解决办法
336
查看次数

找不到 root.crt postgresql

我有一个我正在使用的 postgres docker 映像,并且我正在其上启用 SSL。我希望它验证完整,因为我有一个 root.crt 并且想要确保所有可以使用 SSL 的证书都经过验证。因此,在我的 docker-compose 文件中,我已将 server.crt 和 server.key 挂载到 /var/ssl,将 root.crt 挂载到 /root/.postgresql。

卷: - ~/server_certs:/var/ssl - ~/root_certs:/root/.postgresql

我得到的错误是

ERROR [2018-07-10 20:28:24,355] org.apache.tomcat.jdbc.pool.ConnectionPool: Unable to create initial connections of pool.
! java.io.FileNotFoundException: /root/.postgresql/root.crt (No such file or directory)
! at java.io.FileInputStream.open0(Native Method)
! at java.io.FileInputStream.open(FileInputStream.java:195)
! at java.io.FileInputStream.<init>(FileInputStream.java:138)
! at java.io.FileInputStream.<init>(FileInputStream.java:93)
! at org.postgresql.ssl.jdbc4.LibPQFactory.<init>(LibPQFactory.java:124)
! ... 32 common frames omitted
! Causing: org.postgresql.util.PSQLException: Could not open SSL root certificate file /root/.postgresql/root.crt.
Run Code Online (Sandbox Code Playgroud)

任何有关让 postgres 找到 …

linux docker postgresql-10

6
推荐指数
1
解决办法
8579
查看次数

在 PostgreSQL 中将 CTE 与 IN 结合起来

所以我在 PostgreSQL 10 中有这个简单的查询。

with bunch_of_things as (
    select vans_id from shoes where adidas_id = 1
)

select * from vans where vans.id in (bunch_of_things) ;
Run Code Online (Sandbox Code Playgroud)

我收到错误column "bunch_of_things" does not exist

我知道我可以将第一个选择放在第二个查询的括号内,以定义 IN 部分

但由于我将在同一事务中多次使用第一个查询的结果,因此我不想多次执行相同的查询。

那么如何才能让 IN 与 CTE 一起工作呢?

(如果这是不可能的,我怎样才能获得一次查询结果并在事务中多次使用它们?)

谢谢

postgresql transactions common-table-expression sql-in postgresql-10

6
推荐指数
1
解决办法
3503
查看次数

Postgresql 10 - 并行配置

有4种配置可以启用并行并进行优化,但PostgreSQL 的文档没有说明有关值或计算的任何信息.我的问题是:

1 -如何计算的值max_parallel_workers, max_parallel_workers_per_gathermax_worker_processes

2- work_mem可以根据连接和内存(RAM)计算,但是work_mem如果启用并行,需要改变一些东西吗?

我的假设是:如果机器有8个核心the max_parallel_workers是8并且工作进程和每个聚集的值是32(8*4),那么我从原始配置中获得的数字4是每1个并行工作4个收集.

postgresql postgresql-10

6
推荐指数
1
解决办法
2328
查看次数

如何在 Postgres 上与非特权用户一起使用 UUID?

如何为uuid行设置默认值?,该uuid_generate_v4()功能仅在uuid-ossp扩展启用时才起作用,但无法启用。

postgres=# CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION
postgres=# SELECT uuid_generate_v4();
           uuid_generate_v4           
--------------------------------------
 929d5e41-d7a8-408a-b0e9-feecf10d853d
(1 row)
...
demo=> select uuid_generate_v4();
ERROR:  function uuid_generate_v4() does not exist
LINE 1: select uuid_generate_v4();
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
demo=> CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
ERROR:  permission denied to create extension "uuid-ossp"
HINT:  Must be superuser to create this extension.
Run Code Online (Sandbox Code Playgroud)

docker postgresql-10

6
推荐指数
1
解决办法
5412
查看次数