标签: postgresql

删除在 Psycopg2 中什么都不返回?

我在 PostgreSQL 数据库中有一个相当简单的删除查询,我通过psycopg2.

以以下最小示例为例:

def testDelete():
    db = DbInterface()
    cur = db.conn.cursor()
    cur.execute("DELETE FROM munamelist WHERE name='something'")
    print("Results = ", cur.fetchall())
Run Code Online (Sandbox Code Playgroud)

基本上,PostgreSQL 的文档DELETE说明:

成功完成后,DELETE 命令返回一个命令标签的形式

DELETE count

计数是删除的行数。请注意,当删除被 BEFORE DELETE 触发器抑制时,该数字可能小于与条件匹配的行数。如果 count 为 0,则查询未删除任何行(这不被视为错误)。

但是,psycopg2当您尝试获取查询结果时会引发错误:

Traceback (most recent call last):
  File "autoOrganize.py", line 370, in <module>
    parseCommandLine()
  File "autoOrganize.py", line 363, in parseCommandLine
    testDelete()
  File "autoOrganize.py", line 247, in testDelete
    print("Results = ", cur.fetchall())
psycopg2.ProgrammingError: no results to fetch
Run Code Online (Sandbox Code Playgroud)

该项目是否存在并不重要,您无法获取查询结果。不psycopg2为 SQL …

postgresql postgresql-9.3

3
推荐指数
1
解决办法
8858
查看次数

获取最后一个选择查询的行数

我正在使用一个计划脚本,它将 PostgreSQL 数据库的(新)行导出到一个文本文件中。此脚本的多个实例也为多个 DB 运行:

COPY (SELECT ... FROM ... GROUP BY zzz) TO STDOUT >file.csv
Run Code Online (Sandbox Code Playgroud)

为了对 file.csv 进行一致性检查,我然后运行查询以获取查询的行数COPY

SELECT count(0) FROM ... GROUP BY zzz >linecount
Run Code Online (Sandbox Code Playgroud)

在 bash 脚本中,检查两者是否相等,如果是这种情况,脚本继续运行,否则它会停止并报告错误(这种情况很少发生,但确实发生了 - 我还没有弄清楚原因)

问题,查询结果比较大(大概count(0)5-10分钟),基本上跑了两次(虽然花的时间更短,但还是3-7分钟)

是否有 PostgreSQL 函数来获取最后一个查询的行数?如果是这种情况,我可以大大减少数据库负载并缩短导出时间。

我已经研究过ROW_COUNT,但它似乎只对UPDATE/INSERT而非有效,SELECT出于简单的原因,我还想避免使用函数。

我愿意接受其他建议,例如首先查询临时表,然后从那里导出(也许count(0)会更快)?

Debian 7 Wheezy、SSD、32GB 内存、PostgreSQL 9.1


更新@克雷格林格

我同意一致性检查在设计上有些“缺陷”。我曾经注意到导入检查有一个我无法解释的问题,然后我再次运行导出,并且文件的行与之前的行不同:

Rowcount DB/LinecountF:532395/532014

rowcount: SELECT count(0)... as described originally
linecount  = wc -l
Run Code Online (Sandbox Code Playgroud)

他们作为 cronjobs 运行,我还没有弄清楚为什么这些行丢失了。第二次运行相同的脚本,一切都很好。它很少发生,但日志文件没有说明任何内容(或来自 cron 的邮件结果)。

我没有检查 PSQL 强硬的退出状态(因为我在自己的检查中建立了)。我去做。

postgresql

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

使用 pg_basebackup 备份整个 Postgres 数据库服务器

我使用以下命令支持 Postgres DB 9.1:

pg_basebackup -h 127.0.0.1 -U replicationuser -D /storage/test_backup -Ft -z -P
Run Code Online (Sandbox Code Playgroud)

在 postgresql.conf 我有这个设置:

wal_level = hot_standby              
Run Code Online (Sandbox Code Playgroud)

但是,在pg_basebackup运行结束时,我收到此警告:

注意:未启用 WAL 归档;您必须确保通过其他方式复制所有必需的 WAL 段以完成备份

我只关心从启动时开始的数据备份pg_basebackup(我可以承受夜间的一些停机时间,所以我关闭了使用这个 PG 实例作为后端数据库的应用服务器,然后开始备份)。我不需要也不需要“连续备份”。

问题:从启动pg_basebackup命令开始,我真的必须复制 WAL 才能进行完整备份吗?或者该警告是专门为实现“连续存档”功能而设计的吗?

postgresql backup

3
推荐指数
1
解决办法
7201
查看次数

使用 AVG 计算数字列表的平均值

这可能是一个新手问题(请耐心等待),但是如何使用 SQL 和AVG函数计算数字列表的平均值?我的意思是,我可以将 SQL 中的数字相加,例如:

SELECT 2+3+4
Run Code Online (Sandbox Code Playgroud)

我如何计算平均的234没有将它们插入到表第一?

我尝试了不同种类的变体,例如:

SELECT 2 AS foo UNION 3 AS foo UNION 4 AS foo
  foo
  integer
1 2
2 3
3 4
Run Code Online (Sandbox Code Playgroud)

但:

SELECT AVG(SELECT 2 AS foo UNION 3 AS foo UNION 4 AS foo)
Run Code Online (Sandbox Code Playgroud)

错误:“选择”处或附近的语法错误

我似乎无法找到正确的语法。如果重要的话,我现在正在使用 PostgreSQL。

postgresql aggregate union

3
推荐指数
1
解决办法
7003
查看次数

如何在postgresql中保存年的间隔

我必须保存几年的间隔,例如:

id intervalYears
1  2014/2015
2  2015/2016
3  2016/2017
Run Code Online (Sandbox Code Playgroud)

等等。那些年就像学术年,所以第一年必须小于第二年,但大于或等于实际年份。

那么,如何保存这种数据类型呢?我应该分开日期并添加一些cotraints吗?

postgresql datatypes

3
推荐指数
1
解决办法
913
查看次数

选择所有长度为 n 的子串(n-gram)?

我怎么能选择所有的n-grams,即。使用 SQL 从字符串中提取长度为n 的子字符串?例如,3-克串的例子EXAXAM安培MPLPLE

为了更精确,我使用 PostgreSQL。

postgresql

3
推荐指数
1
解决办法
1524
查看次数

为什么 postgres 使用与查询无关的奇数索引

(Debian 7, Postgres 9.3, 具有巨大缓存的专用机器)

我有一个名为 process_data (14gb) 的大表和另一个名为 process_location 的小查找表。我正在这两者之间进行查询,并且在解释查询中 Postgres 使用了一个与查询内容完全无关的奇数索引,如下所示:

询问:

select l.name,
       count(1) as quantity
from process_data pd
     join process_location l on pd.fk_location = l.id_process_location
where pd.active and pd.fk_status = 1
group by l.name
order by l.name
limit 1000
Run Code Online (Sandbox Code Playgroud)

解释查询给了我这个:

+----------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                  QUERY PLAN                                                                  |
+----------------------------------------------------------------------------------------------------------------------------------------------+
| Limit  (cost=166513.62..166513.88 rows=107 width=33)                                                                                         |
|   ->  Sort  (cost=166513.62..166513.88 rows=107 width=33)                                                                                    |
|         Sort Key: s.name                                                                                                                     |
|         ->  HashAggregate  (cost=166508.94..166510.01 rows=107 width=33)                                                                     |
|               ->  Hash Join  (cost=4.84..165278.56 …
Run Code Online (Sandbox Code Playgroud)

postgresql index index-tuning postgresql-9.3

3
推荐指数
1
解决办法
206
查看次数

如何在 Windows 7 上为 Postgresql 9.2 创建表空间?

我尝试运行这个简单的命令:

CREATE TABLESPACE tb_rec
  OWNER postgres
  LOCATION 'd:/tablespaces';
Run Code Online (Sandbox Code Playgroud)

但是,未创建表空间,我收到以下消息:

ERREUR:  n'a pas pu configurer les droits du répertoire « d:/tablespaces » : Permission denied
Run Code Online (Sandbox Code Playgroud)

对于非法语人士:

ERROR: was not able to configure the directory rights « d:/tablespaces » : Permission denied
Run Code Online (Sandbox Code Playgroud)

我没有找到任何 postgres 用户 ( net user) 并且我被困在这个......

如何将目录访问权限授予 postgres?

Windows 7
Postgres 9.2

postgresql windows tablespaces postgresql-9.2

3
推荐指数
1
解决办法
5795
查看次数

PostgreSQL CREATE INDEX 内存要求

我的笔记本电脑上有 6GB 的 RAM,为了进行测试,我在 PostgreSQL 9.3 中创建了一个 5000 万行的表。然后我想在表上创建一个索引。

表和结果索引一起(或表总大小的两倍)可以放入 5GB 的 RAM,我设置maintenance_work_mem为 5GB,仍然CREATE INDEX使用外部排序和大约 1.4GB 的临时文件。为什么呢?

我对它应该能够在 RAM 中进行排序的期望是不合理的吗?

test=# set maintenance_work_mem to '5GB';
SET
test=# create table t1 as (select i::int, random() as f from generate_series(1, 50000000) i);
SELECT 50000000
test=# select pg_size_pretty(pg_relation_size('t1'));
 pg_size_pretty 
----------------
 2111 MB
(1 row)

test=# create index on t1(f, i);
CREATE INDEX
test=# select pg_size_pretty(pg_relation_size('t1_f_i_idx'));
 pg_size_pretty 
----------------
 1504 MB
(1 row)
Run Code Online (Sandbox Code Playgroud)

在服务器日志中:

LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp22623.1", size 1073741824 …
Run Code Online (Sandbox Code Playgroud)

postgresql index memory postgresql-9.3

3
推荐指数
1
解决办法
1541
查看次数

CTE 是多线程的吗?

这里这里似乎表明它们是,但我也被告知(源无法定位)多行单语句插入只会使用一个线程进行所有写入,要多线程化,查询应该被分解并发送到与核心数量一样多的连接。

文件指出,热膨胀系数执行“同时”,但没有效果,用来“热膨胀系数将使用所有可用内核来处理任何并行子报表和/或主查询”链接说明确。

CTE 是否总是将所有可用内核用于任何并行任务?如果是这样,除了可以合理地假设与 链接之外,还有什么警告RETURNING吗?

postgresql cte parallelism

3
推荐指数
1
解决办法
971
查看次数