【问题标题】:How can I save records in psql during iteration in a file如何在文件中迭代期间将记录保存在 psql 中
【发布时间】:2015-06-24 22:14:03
【问题描述】:

我有一个只包含 id 的文件。 id 匹配表中的列之一。我想提取该列中的记录并在 csv 文件中获取结果。我不想创建另一个表。

我有 docid.txt 包含以下数据的文件:

12000072
112073
11279
1182
11188
11182094
82099
11102

这些中的每一个都对应于学生表中的一个 nameid 列。学生表有:

name    nameid      dob         performance
-------------------------------------------
andre   12000072    12/4/1990   Excellent
Scott   112073      12/5/1999   Good
Reagan  2692882     15/7/2003   fair
Aldo    1402508     4/7/1998    Poor
Mary    2266257     5/11/1995   Very good
Walt    11182094    3/12/2000   Good
Tessy   82099       8/12/1999   Very good
Skinn   11102       7/2/2002    Excellent
Smart   678016      12/4/1990   fair
John    475689      12/5/1999   Poor
Rita    2796799    12/4/1990    Very good
Rachael 11188      12/5/1999    Poor
Gomez   3075168    3/12/2000    Very good
Becham  3075168    4/7/1998     Good
Walker  1050879    5/11/1995    Very good
Tommy   2017451    3/12/2000    Excellent
Trevor  11279      7/2/2002     Good
Litin   1182       12/5/1999    fair
Martha  883368     15/7/2003    fair
Rafael  3070833    4/7/1998     Poor
Kim     3070833    5/11/1995    Very good
Clichy  255918     12/4/1990    Good
Mario   2706915    12/5/1999    Excellent

我想从学生表中删除具有 docid 的学生。我尝试了以下方法:

for i in `cat docid.txt;` do
`psql -A -t $dbname $username << EOF`
`select * from student where nameid = $i;`
`EOF`
`done  >>docid.csv`

谢谢

【问题讨论】:

  • 您使用的是什么数据库引擎?您的标签令人困惑。
  • Linux 上的 postgre。第一个文档可以从任何 csv 文件(excel、csv 甚至 txt)中读取,但表格来自 postgre。我无权在数据库中创建表。

标签: excel postgresql csv ssh psql


【解决方案1】:

假设您使用的是 PostgreSQL,我建议将它们 copying 到一个临时表中,然后加入它。

例如

$ psql <<'__END__'
BEGIN;
CREATE TEMPORARY TABLE docids (docid integer) ON COMMIT DROP;
\copy docids from 'docids.txt'
DELETE FROM student USING docids WHERE nameid = docid;
COMMIT;
__END__

除了比循环更简洁、更简洁之外,它还将快得多,而且它作为一个整体要么成功要么失败,而不会因为错误而留下一半完成的工作。

如果要输出删除的行,请将RETURNING * 附加到DELETE 语句中,并使用psql -q 运行以抑制其他输出。

【讨论】:

  • 我想到了,但我在服务器上远程工作,我无权在里面创建表。我需要一个不创建表格的解决方案。谢谢
  • 您应该仍然可以CREATE TEMPORARY TABLE,即使您无法创建普通表。如果没有,请向管理员询问您的用户的TEMP 权限。如果你真的,真的连这个都做不到,你可以将你的数据变成一个带有脚本的大 VALUES 子句并加入它。否则,您必须编写一个执行BEGIN 的脚本,读取输入文件并将每一行作为DELETE 发送,然后执行COMMIT。 Python 和 psycopg2 可能适用于此。
猜你喜欢
  • 1970-01-01
  • 2012-09-06
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 2016-06-27
相关资源
最近更新 更多