小编Lau*_*lbe的帖子

psycopg2 中的事务支持

我对阅读psycopg2文档关于它如何处理事务(除了使用它与with语句)感到有点困惑。

通读文档我明白了

默认情况下,Psycopg 在执行第一个命令之前打开一个事务:如果不调用 commit(),任何数据操作的效果都将丢失。

假设上述陈述是正确的

dbconn = psycopg2.connect(...)   cursor = dbconn.cursor()
cursor.execute("insert record into a") 
cursor.execute("insert record into b")

cursor.execute("insert record into c") // This throw integrity error.
cursor.execute("commit") // this logs "WARNING:  there is no transaction in progress"
Run Code Online (Sandbox Code Playgroud)

对于数据的操纵ab就会迷失方向

但据我所知,这在 PostgreSQL 上并没有发生。我肯定在这里错过了一些东西,但现在我不确定什么以及在哪里。

postgresql psycopg2

5
推荐指数
1
解决办法
1973
查看次数

Postgresql 使用自定义停用词列表创建搜索配置

对于特定的全文搜索,我需要修改标准停用词文件并排除一些单词。到目前为止我做了什么:

复制german.stopgerman_modified.stop,然后从 中删除文字german_modified.stop。然后:

CREATE TEXT SEARCH DICTIONARY public.german_nostop (
   TEMPLATE = pg_catalog.simple,
   STOPWORDS = german_modified
);

CREATE TEXT SEARCH CONFIGURATION public.german_nostop (
   COPY = pg_catalog.german
);

ALTER TEXT SEARCH CONFIGURATION public.german_nostop
   ALTER MAPPING
      FOR asciiword, asciihword, hword_asciipart, hword, hword_part, word
      WITH german_nostop;

CREATE INDEX body_idx ON comments
   USING gin (to_tsvector('german_nostop', body));
Run Code Online (Sandbox Code Playgroud)

但当我这样做时

SELECT body, autor
FROM comments
WHERE to_tsvector('german_nostop', body) @@ to_tsquery('wie');
Run Code Online (Sandbox Code Playgroud)

我得到:

NOTICE:  text-search query contains only stop words or doesn't contain lexemes, …
Run Code Online (Sandbox Code Playgroud)

postgresql full-text-indexing

5
推荐指数
1
解决办法
1592
查看次数

如何在PostgreSQL函数中使用COMMIT和ROLLBACK

我使用三个插入语句,如果第三个语句中有错误,我想回滚第一个和第二个.如果没有办法做到这一点,请告诉我一个不同的方法来处理PostgresqQL中的这个.

如果我使用COMMITROLLBACK,我收到错误.

CREATE OR REPLACE FUNCTION TEST1 ()
   RETURNS VOID
   LANGUAGE 'plpgsql'
   AS $$
BEGIN 

    INSERT INTO table1 VALUES (1);

    INSERT INTO table1 VALUES (2);

    INSERT INTO table1 VALUES ('A');
    COMMIT;
EXCEPTION
   WHEN OTHERS THEN
   ROLLBACK;
END;$$;
Run Code Online (Sandbox Code Playgroud)

上面的代码不起作用; COMMIT并且ROLLBACKPostgreSQL函数不支持.

postgresql postgresql-10

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

在 Postgres SQL 查询的 WHERE 子句中指定日期的时区

在 Postgres 中,我总是使用带时区的时间戳来存储我的日期。

为便于讨论,假设我必须在 2018 年 1 月 16 日东部时区 (EST -04) 的时间(上午 8 点、下午 1 点和晚上 10 点)存储事件。数据库中的时间戳将是:

  • 上午 8 点:“2018-01-16 12:00:00.000+00”
  • 下午 1 点:“2018-01-16 17:00:00.000+00”
  • 晚上10点:“2018-01-17 02:00:00.000+00”

我将如何编写 Postgres SQL 查询来获取 2018-01-16 EST 上发生的所有事件?

postgresql datetime

5
推荐指数
1
解决办法
2255
查看次数

是否在SELECT ... ORDER BY ... FOR UPDATE语句中按顺序锁定行?

这个问题可以被视为对我的评论的后续跟进可以两个并发但相同的DELETE语句导致死锁吗?.

我想知道my_status在以下语句中行是否按升序锁定:

SELECT 1 FROM my_table ORDER BY my_status FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)

https://www.postgresql.org/docs/9.5/static/sql-select.html上有一句有趣的评论说:

SELECTREAD COMMITTED事务隔离级别运行的命令以及使用ORDER BY和锁定子句可能无序地返回行.这是因为ORDER BY首先应用.该命令对结果进行排序,但可能会阻止尝试获取一个或多个行的锁定.一旦SELECT疏导,一些排序列值可能已被修改,导致出现被淘汰的顺序(尽管它们是为了在原有的列值而言)的行.例如,可以通过将FOR UPDATE/ SHARE子句放在子查询中来根据需要解决这个问题

SELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss ORDER BY column1;
Run Code Online (Sandbox Code Playgroud)

我不确定这是否能回答我的问题.所有这些都是ORDER BY首先应用的,并且您需要放入FOR UPDATE子查询来解决副作用,如果在此期间更改了订单列的值,实际输出顺序可能会有所不同.换句话说,放入FOR UPDATE子查询可确保在订购之前发生锁定.

但这并没有真正告诉我们这些行是否实际上是按照ORDER BY条款确定的顺序锁定的?

sql postgresql database-deadlocks postgresql-9.5

5
推荐指数
0
解决办法
279
查看次数

将多行中的 tsvector 合并为一行

我有一个带有文本字段和tsvector包含该字段的搜索索引的表:

CREATE TABLE test (pk bigint, value text, tsv tsvector);
Run Code Online (Sandbox Code Playgroud)

如何创建一个单一的tsvector,它是满足某些条件的所有行的向量的组合?

SELECT value FROM test
WHERE combine_my_vectors(SELECT tsv FROM test WHERE pk IN (some list))
      @@ to_tsquery('search me');
Run Code Online (Sandbox Code Playgroud)

我知道tsvectors 可以与 组合||,但这似乎在这里不可能。我有什么用combine_my_vectors

我希望避免value先组合文本字段,然后再创建tsvector文本字段。

postgresql full-text-search

5
推荐指数
1
解决办法
1432
查看次数

在没有任何停机时间的情况下在 PostgresSQL 中将 `int` 迁移到 `bigint`?

我有一个数据库,它将遇到Basecamp 在 11 月著名的整数耗尽问题。我有几个月的时间来弄清楚该怎么做。

是否有无需停机的主动解决方案来迁移这种色谱柱类型?如果是这样,那是什么?如果没有,这只是解决停机时间并尽可能迁移色谱柱的问题吗?

就是这篇文章足够的,假设我已经好几天/几周执行迁移现在之前我不得不这样做时,我的id跑出来了?

postgresql database-migration downtime

5
推荐指数
2
解决办法
1505
查看次数

为什么Postgres更喜欢seq扫描而不是带有显式where条件的部分索引?

我有一个简单的查询,例如select * from xxx where col is not null limit 10。我不知道为什么Postgres更喜欢seq扫描,它比部分索引要慢得多(我已经分析了表格)。如何调试这样的问题?

该表有超过400万行。并满足了约350,000行pid is not null

我认为成本估算可能有问题。seq扫描的成本低于索引扫描。但是如何深入研究呢?

我有一个猜测,但不确定。非空行约占总行的10%。这意味着当seq扫描100行时,它可能会得到10行,这些行不为空。并且它认为seq扫描100行的成本低于索引扫描10行,然后随机获取10整行的成本。是吗?

> \d data_import
+--------------------+--------------------------+----------------------------------------------------------------------------+
| Column             | Type                     | Modifiers                                                                  |
|--------------------+--------------------------+----------------------------------------------------------------------------|
| id                 | integer                  |  not null default nextval('data_import_id_seq'::regclass) |
| name               | character varying(64)    |                                                                            |
| market_activity_id | integer                  |  not null                                                                  |
| hmsr_id            | integer                  |  not null default (-1)                                                     |
| site_id            | integer                  |  not null default (-1)                                                     |
| hmpl_id …
Run Code Online (Sandbox Code Playgroud)

database postgresql indexing database-performance postgresql-9.4

5
推荐指数
1
解决办法
351
查看次数

如何为 PostgreSQL 中的表创建同义词

我正在将此 Oracle 命令迁移到 PostgreSQL:

CREATE SYNONYM &user..emp FOR &schema..emp;
Run Code Online (Sandbox Code Playgroud)

请向我建议如何迁移上述命令。

postgresql database-migration synonym

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

为什么 auto_explain 仅在第一次调用 PL/pgSQL 函数时记录嵌套语句?

在我的 Postgres 服务器上,我使用onauto_explain模块来log_nested_statements记录 PL/pgSQL 函数中的其他函数调用。

594 session_preload_libraries = 'auto_explain'
595
596 auto_explain.log_min_duration = 0
597 auto_explain.log_nested_statements = true
598 auto_explain.sample_rate = 1.0
Run Code Online (Sandbox Code Playgroud)

我有一个玩具 PL/pgSQL 函数baz(count int)

Schema              | public
Name                | baz
Result data type    | text
Argument data types | count integer
Type                | normal
Volatility          | volatile
Parallel            | unsafe
Owner               | aerust
Security            | invoker
Access privileges   |
Language            | plpgsql
Source code         |                                      +
                    | DECLARE                              +
                    |     i int …
Run Code Online (Sandbox Code Playgroud)

postgresql logging sql-execution-plan

5
推荐指数
1
解决办法
1045
查看次数