具有这种简单的多对多自引用结构。
一个项目通过表拥有其他项目joins:
CREATE TABLE items (
item_id serial PRIMARY KEY
, title text
);
CREATE TABLE joins (
id serial PRIMARY KEY
, item_id int
, child_id int
);
INSERT INTO items (item_id, title) VALUES
(1, 'PARENT')
, (2, 'LEVEL 2')
, (3, 'LEVEL 3.1')
, (4, 'LEVEL 4.1')
, (5, 'LEVEL 4.2')
, (6, 'LEVEL 3.2')
;
INSERT INTO joins (item_id, child_id) VALUES
(1, 2)
, (2, 3)
, (3, 4)
, (3, 5)
, (2, 6) …Run Code Online (Sandbox Code Playgroud) 我正在使用 Pglogic 和 Postgresql v9.5 测试逻辑复制。
简单的配置似乎还可以。它的意思是:
但是,订阅包含特定模式中的表的新replication_set 不起作用。
该命令通过(在提供者节点中):
select pglogical.replication_set_add_all_tables(
set_name := 'new_replication_set',
schema_names := '{myschema}',
synchronize_data := 'true'
);
Run Code Online (Sandbox Code Playgroud)
该命令通过(在订阅者节点中):
select pglogical.create_subscription(
subscription_name := 'subscription',
replication_sets := array['new_replication_set'],
provider_dsn := 'host=10.20.30.40 port=6432 dbname=production user=pglogical_prod',
synchronize_data := 'true'
);
Run Code Online (Sandbox Code Playgroud)
但订阅者节点中的表是空的。
我错过了什么吗?感谢致敬。
附加信息:
select pglogical.alter_subscription_synchronize(...)并select pglogical.alter_subscription_resynchronize_table(...)发出命令,
订阅者节点中的表也处于特定模式中,
select * from pglogical.queue;请求不为空。
下面是从订阅者节点获取的日志消息:
我在订阅者节点中设置了 log_min_message = debug5 。
下面是错误消息:
792 < 2018-03-14 11:38:56.449 CET >LOG: starting apply for subscription subscription
793 < 2018-03-14 …Run Code Online (Sandbox Code Playgroud) format我在使用下面示例中的函数正确引用表名时遇到一些问题。
CREATE OR REPLACE FUNCTION copy_table(_source_tbl regclass, _target_tbl text)
RETURNS bool AS $func$
DECLARE query_str text;
BEGIN
query_str = format($fmt$ DROP TABLE IF EXISTS %1$I; CREATE TABLE %1$I AS (TABLE %s); $fmt$, _target_tbl, _source_tbl);
EXECUTE query_str;
RAISE NOTICE '%', query_str;
RETURN True;
END $func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我的困境是我想引用输入表名称_target_tbl作为标识符(以避免 SQL 注入)。但是,给定完整的表名称ex.test1,这会导致架构部分ex.被视为表名称的一部分,并public."ex.test1"在默认public.架构中创建表,如下所示。
我应该如何在此处正确引用/格式化标识符?
=> SELECT copy_table('ex.test', 'ex.test1');
NOTICE: table "ex.test1" does not exist, skipping
NOTICE: DROP TABLE IF EXISTS "ex.test1"; CREATE TABLE …Run Code Online (Sandbox Code Playgroud) 是否可以使用 PostgreSQL 中的 citus 扩展来创建复制到每个工作节点的临时表(如引用表)?
当我像这样运行 SQL 时:
DROP TABLE IF EXISTS mypoint;
CREATE TEMP TABLE mypoint (mpoint geometry primary key);
SELECT create_reference_table('mypoint');
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Run Code Online (Sandbox Code Playgroud)ERROR: unacceptable schema name "pg_temp_6" DETAIL: The prefix "pg_" is reserved for system schemas. CONTEXT: while executing command on mynode01:5432 SQL state: 42939
我问这个问题的原因是因为之后有更多的 SQL 命令,我需要在临时表和分布式表之间进行联接(citus 扩展不允许这样做)。
我有几个对象之间的距离矩阵,如下所示:
Method 1
A B C D ...
A 0.0000000 . . .
B 0.5458965 0.0000000 . .
C 0.9758267 0.9673959 0.0000000 .
D 0.9714434 0.9589730 0.5715958 0.0000000
...
Method 2
A B C D ...
A 0.0000000 . . .
B 0.1063699 0.0000000 . .
C 0.4997017 0.4857148 0.0000000 .
D 0.4968287 0.4752771 0.0639429 0.0000000
...
Method 3
...
Run Code Online (Sandbox Code Playgroud)
为了给人一种规模感,每个矩阵大约为 10,000 x 10,000,我有五种不同的距离计算方法。
我还有一个 Postgres 数据库,其中有一个表存储有关对象 A、B、C、D 等的信息,因此我正在专门研究 SQL 解决方案。
假设用户在我的应用程序中选择对象 B。然后,我显示与 B 最接近的对象的表格。由于距离矩阵具有不同的尺度,因此我将这些值转换为排名,并使用排名的平均值对结果进行排序。
存储这些数据的有效方法是什么?明显的方法是这样的:
method obj1 obj2 d …Run Code Online (Sandbox Code Playgroud) 我有一个表,我想从中删除很多行,但由于内存限制而失败。我看到一个建议“简单地”将我不想删除的所有行复制到新表中,删除旧表,然后将新表重命名为旧表的名称。除了依赖于原始表的其他对象之外,这很好。据我所知,这意味着我必须放弃级联,然后重新创建依赖于原始表的所有内容。
有没有办法编写依赖于原始表的所有内容的脚本,以便我可以轻松地在 pgadmin 或 psql 中重新创建它们?
或者,是否有办法忽略依赖关系足够长的时间来删除旧表并将新表重命名为旧表的名称?
我相信这就是 pg_repack 的工作原理,所以一定有办法。
我正在使用 Postgresql 9.6,我想运行这样的查询:
\n\nselect post_id \nfrom comments \nwhere to_tsvector(\'pg_catalog.persian\', comments.body) @@ to_tsquery(\'pg_catalog.persian\', \'\xda\xa9\xd8\xaa\xd8\xa7\xd8\xa8\') ;\nRun Code Online (Sandbox Code Playgroud)\n\n但波斯语不在 postgresql 字典支持的语言之列:
\n\npostgres=# \\dF\n List of text search configurations\n Schema | Name | Description \n------------+------------+---------------------------------------\n pg_catalog | danish | configuration for danish language\n pg_catalog | dutch | configuration for dutch language\n pg_catalog | english | configuration for english language\n pg_catalog | finnish | configuration for finnish language\n pg_catalog | french | configuration for french language\n pg_catalog | german | configuration for german …Run Code Online (Sandbox Code Playgroud) 在 PostgreSQL 中的触发器过程上指定CALLED ON NULL INPUT, RETURNS NULL ON NULL INPUTor STRICT( https://www.postgresql.org/docs/current/static/sql-createfunction.html ) 会起到什么作用吗?
由于触发器过程必须声明为不带参数的函数(https://www.postgresql.org/docs/current/static/plpgsql-trigger.html),我怀疑它有任何效果,但我找不到明确的答案关于这一点。
这是我的代码:
class csvimportt(Base):
__tablename__ = 'csvimportt'
#id = Column(INTEGER, primary_key=True, autoincrement=True)
aid = Column(INTEGER(unsigned=True, zerofill=True),
Sequence('article_aid_seq', start=1001, increment=1),
primary_key=True)
Run Code Online (Sandbox Code Playgroud)
我想设置一个从 1000 开始的自动增量值。我该怎么做?
我尝试了各种方法在手册中查找pg_temp,但没有找到。手册中有记录吗?
postgresql ×10
citus ×1
cte ×1
dynamic-sql ×1
functions ×1
json ×1
orm ×1
plpgsql ×1
python ×1
recursive ×1
replication ×1
sqlalchemy ×1
tree ×1
trigger ×1