我对阅读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)
对于数据的操纵a,b就会迷失方向。
但据我所知,这在 PostgreSQL 上并没有发生。我肯定在这里错过了一些东西,但现在我不确定什么以及在哪里。
对于特定的全文搜索,我需要修改标准停用词文件并排除一些单词。到目前为止我做了什么:
复制german.stop到german_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) 我使用三个插入语句,如果第三个语句中有错误,我想回滚第一个和第二个.如果没有办法做到这一点,请告诉我一个不同的方法来处理PostgresqQL中的这个.
如果我使用COMMIT或ROLLBACK,我收到错误.
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函数不支持.
在 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 上发生的所有事件?
这个问题可以被视为对我的评论的后续跟进可以两个并发但相同的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上有一句有趣的评论说:
SELECT在READ COMMITTED事务隔离级别运行的命令以及使用ORDER BY和锁定子句可能无序地返回行.这是因为ORDER BY首先应用.该命令对结果进行排序,但可能会阻止尝试获取一个或多个行的锁定.一旦SELECT疏导,一些排序列值可能已被修改,导致出现被淘汰的顺序(尽管它们是为了在原有的列值而言)的行.例如,可以通过将FOR UPDATE/SHARE子句放在子查询中来根据需要解决这个问题Run Code Online (Sandbox Code Playgroud)SELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss ORDER BY column1;
我不确定这是否能回答我的问题.所有这些都是ORDER BY首先应用的,并且您需要放入FOR UPDATE子查询来解决副作用,如果在此期间更改了订单列的值,实际输出顺序可能会有所不同.换句话说,放入FOR UPDATE子查询可确保在订购之前发生锁定.
但这并没有真正告诉我们这些行是否实际上是按照ORDER BY条款确定的顺序锁定的?
我有一个带有文本字段和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文本字段。
我有一个简单的查询,例如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
我正在将此 Oracle 命令迁移到 PostgreSQL:
CREATE SYNONYM &user..emp FOR &schema..emp;
Run Code Online (Sandbox Code Playgroud)
请向我建议如何迁移上述命令。
在我的 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)