我想使用 psql 列出 Postgres 服务器上的所有数据库,以便由脚本解析。此命令列出了它们:
psql -l -A -t
Run Code Online (Sandbox Code Playgroud)
但输出显示了一个明显的问题:记录由换行符分隔,但也包含换行符。
$ psql -l -A -t
postgres|postgres|UTF8|en_CA.UTF-8|en_CA.UTF-8|
template0|postgres|UTF8|en_CA.UTF-8|en_CA.UTF-8|=c/postgres
postgres=CTc/postgres
template1|postgres|UTF8|en_CA.UTF-8|en_CA.UTF-8|=c/postgres
postgres=CTc/postgres
Run Code Online (Sandbox Code Playgroud)
使用 -R 选项我可以更改记录分隔符,但似乎无论我将其更改为什么,都存在该字符串出现在数据中的风险。是否可以告诉 psql 用其他东西替换数据中的换行符?(然后如果该字符串也出现在数据中呢?)
我还尝试设置的记录分隔符为空字符这样的序列-R '\000'和-R "\0",但它似乎并没有解释转义序列在所有的参数,并且只使用文本字符串\000代替。
我知道列出所有数据库的另一个选项是:
psql --quiet --no-align --tuples-only --dbname=postgres --username=postgres --host=127.0.0.1 --port=5432 --command="SELECT datname FROM pg_database"
Run Code Online (Sandbox Code Playgroud)
但这需要我为 postgres 用户提供密码,所以这是不可取的。也许还有另一种方法可以获得所有数据库的名称列表?
我正在尝试恢复数据以选择数据库的表 (9.3.5)。这是从生产到测试的数据刷新,同时在测试数据库中维护一些表数据(如应用程序用户表)。我首先截断我计划刷新的表,然后我可以使用以下命令成功恢复 1 个表:
pg_restore -a -d ACMETEST -n public -v -U acme -t hardware /var/acme/backups/restore/ACMEDatabase.bak
,它给出以下响应,紧接着是命令提示符:!pg_restore:连接到数据库进行恢复 pg_restore:处理表“硬件”的数据 pg_restore:设置表数据硬件的所有者和权限
查询显示数据加载成功。
手册页并未表明您可以通过使用数组作为 -t 的输入来一次将数据恢复到多个表中,但我认为这是可能的,所以尝试了这个:
pg_restore -a -d ACMETEST -n public -v -U acme -t hardware,location /var/acme/backups/restore/ACMEDatabase.bak
第二个命令的结果是一行,内容如下:
然后它将我转回命令提示符,就好像命令已完成但没有加载任何数据。
我确实查看了 -L 选项以使用列表文件,但我正在尝试创建一个可重复的过程,该过程可供全国各地数据库上的许多人使用,因此我没有看到从列表中注释掉大量行的过程列表文件为每个还原具有实际成功的机会。我是否必须为我想要恢复的每个单独的表执行第一个命令,或者有什么方法可以将一组表提供给这个命令?
我正在尝试在单个事务中执行 sql 脚本文件。该文件包含一些其他脚本的包含,这些脚本在我的示例中创建了一些表。它看起来像这样:
\include ../tables/table1.cre
\include ../tables/table2.cre
...
\include ../tables/table10.cre
Run Code Online (Sandbox Code Playgroud)
我正在使用psql:
psql -X --set AUTOCOMMIT=off --set ON_ERROR_STOP=on -e --single-transaction -d my_db -f my_script.sql
Run Code Online (Sandbox Code Playgroud)
问题是 include meta 命令的错误不会导致事务回滚。例如,如果某些 tableX.cre 文件丢失,则将提交其包含之前的任何更改。但是,如果有一些 SQL 语法错误,一切都会按预期工作。
是否有可能以某种方式处理包含相关错误并回滚活动事务?
我正在使用 PostgreSQL 9.2.1。
我有一个简单的脚本,它应该执行一个选择语句并将其输出到 CSV。我的问题是脚本连接到数据库并挂起等待我的 sql 指令(这些指令在脚本上并且应该自动执行)。任何帮助将不胜感激。
Set-Location 'E:\Program Files\PostgreSQL\9.1\bin\';
$env:PGPASSWORD = 'mypwd';
.\psql --% -U postgres -w myDB
.\psql --% -c "copy {'SELECT * FROM myTable';} TO 'C:\Users\e\Desktop\test1.csv' CSV DELIMITER ',';"
Run Code Online (Sandbox Code Playgroud)
我正在寻找在 PSQL 中执行多个命令的解决方案。
假设我有一个数据库名称为2 的文件。
1. slave1
2. slave2
Run Code Online (Sandbox Code Playgroud)
我已经有一个名为“ master_db”的主模板。
如果我手动完成,我将执行以下操作:
CREATE DATABASE slave1 TEMPLATE master_db;
CREATE DATABASE slave2 TEMPLATE master_db;
Run Code Online (Sandbox Code Playgroud)
如果只有 2 个,那会很容易,但在我的情况下有 30 个以上,因此我想知道我们是否可以创建一个脚本。我确实尝试过搜索,但找不到解决方案。
如果这很重要,数据库在同一个集群中。
我打开psql并写:
mydb=> \dt
Run Code Online (Sandbox Code Playgroud)
并显示了此表列表:
List of relations
Schema | Name | Type | Owner
--------+----------------------------+-------+---------
public | auth_group | table | foouser
...
Run Code Online (Sandbox Code Playgroud)
我必须按下Esc才能返回提示,输出消失了,就像它是一个less会话。
我想保留输出,以便我可以使用其中的信息来编写查询,但谷歌搜索找不到这样做的选项。
无论如何,有没有改变psql. 以下面的查询为例。执行它。
CREATE TABLE foo
AS
SELECT x AS id,
-- x AS id2,
x AS id3
FROM generate_series(1,50) AS x;
Run Code Online (Sandbox Code Playgroud)
在 psql 中运行它。然后运行\e。至少现在,对我来说,我在编辑器中看到的是没有一行。这真让我抓狂。有没有办法解决这个问题。 传递给编辑器的缓冲区中没有注释。通常,它被评论而不是被删除,因为我想在以后取消评论它。
错误信息与使用 COPY 的超级用户相同。这些文件与 postgres 服务器位于同一台服务器上。看到很多类似的帖子,但没有一个回答我的问题。
\copy table_name from '/path/to/csv/file.csv'
with format csv, header true ;
ERROR: syntax error at or near "format"
Run Code Online (Sandbox Code Playgroud)
是否带括号。仔细阅读postgres版本 10的手册。没有帮助。我一定遗漏了一些小问题,请指出。
假设我从提示中获得价值?
\prompt 'Write [Yes] or [No]\n' store
Run Code Online (Sandbox Code Playgroud)
这样做,
Write [Yes] or [No]
Yes
Run Code Online (Sandbox Code Playgroud)
我可以验证我有那个作品,
\echo :store
Yes
Run Code Online (Sandbox Code Playgroud)
但是,我无法使用它 \if
\if :store='Yes'
unrecognized value "Yes=Yes" for "\if expression": Boolean expected
Run Code Online (Sandbox Code Playgroud)
\prompt's doc 对此不多说
\prompt [ text ] name提示用户提供分配给变量名称的文本。可以指定可选的提示字符串 text。(对于多词提示,用单引号将文本括起来。)默认情况下,\prompt 使用终端进行输入和输出。但是,如果使用了 -f 命令行开关,\prompt 将使用标准输入和标准输出。