我在 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 数据库的(新)行导出到一个文本文件中。此脚本的多个实例也为多个 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 强硬的退出状态(因为我在自己的检查中建立了)。我去做。
我使用以下命令支持 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 才能进行完整备份吗?或者该警告是专门为实现“连续存档”功能而设计的吗?
这可能是一个新手问题(请耐心等待),但是如何使用 SQL 和AVG函数计算数字列表的平均值?我的意思是,我可以将 SQL 中的数字相加,例如:
SELECT 2+3+4
Run Code Online (Sandbox Code Playgroud)
我如何计算平均的2,3并4没有将它们插入到表第一?
我尝试了不同种类的变体,例如:
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。
我必须保存几年的间隔,例如:
id intervalYears
1 2014/2015
2 2015/2016
3 2016/2017
Run Code Online (Sandbox Code Playgroud)
等等。那些年就像学术年,所以第一年必须小于第二年,但大于或等于实际年份。
那么,如何保存这种数据类型呢?我应该分开日期并添加一些cotraints吗?
我怎么能选择所有的n-grams,即。使用 SQL 从字符串中提取长度为n 的子字符串?例如,3-克串的例子是EXA,XAM,安培,MPL,PLE。
为了更精确,我使用 PostgreSQL。
(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) 我尝试运行这个简单的命令:
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
我的笔记本电脑上有 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 ×10
index ×2
aggregate ×1
backup ×1
cte ×1
datatypes ×1
index-tuning ×1
memory ×1
parallelism ×1
tablespaces ×1
union ×1
windows ×1