假设我有一个类似的查询
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 做到这一点?
我正在尝试将 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,因为这些文件各自具有非常不同的结构。
我正在尝试从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出版物)。
我在这里想念什么?
有没有办法快速删除我一直在输入的整个查询?
需要澄清的是,这将是我仍在输入的查询,而不是当前正在运行的查询。
例如,在 bash 中,您可以按CTRL+C并杀死当前行,例如:
$ typing some comman<CTRL-C>
Run Code Online (Sandbox Code Playgroud)
按CTRL+后C,它会停止我之前输入的内容而不执行。
这只是我习惯于快速切换思路的做法(“哦,如果我这样做而不是这样做怎么办?”),但是postgres 终端中的CTRL+只会终止该过程。C
在 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) "bonjouràtous"(大家好)
我来自这个帖子: 如何用SQL中的另一列选择MAX(列值),DISTINCT的行?
这家伙几乎在我的项目中做了我需要的.事实上,我正在尝试做类似Git的事情:检索上一版本中的所有实例.目前,我有一个表"UM",具有以下属性:
我在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) 我有一个我正在使用的 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 找到 …
所以我在 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
有4种配置可以启用并行并进行优化,但PostgreSQL 的文档没有说明有关值或计算的任何信息.我的问题是:
1 -如何计算的值
max_parallel_workers,max_parallel_workers_per_gather和max_worker_processes?2-
work_mem可以根据连接和内存(RAM)计算,但是work_mem如果启用并行,需要改变一些东西吗?
我的假设是:如果机器有8个核心the max_parallel_workers是8并且工作进程和每个聚集的值是32(8*4),那么我从原始配置中获得的数字4是每1个并行工作4个收集.
如何为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) postgresql-10 ×10
postgresql ×7
docker ×2
java ×1
jpa ×1
jpql ×1
linux ×1
postgres-fdw ×1
python ×1
python-3.x ×1
replication ×1
sql-in ×1
sqlalchemy ×1
transactions ×1