Answers:
您要在服务器还是客户端上生成结果文件?
如果您想要一些易于重用或自动化的东西,可以使用Postgresql内置的COPY命令。例如
Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;
这种方法完全在远程服务器上运行 -无法写入本地PC。它也需要以Postgres的“超级用户”(通常称为“ root”)运行,因为Postgres不能阻止它使用该计算机的本地文件系统执行令人讨厌的事情。
这实际上并不意味着您必须以超级用户身份进行连接(自动连接会带来另一种安全风险),因为您可以使用该SECURITY DEFINER
选项CREATE FUNCTION
来使功能像超级用户一样运行。
关键部分是您的函数可以执行其他检查,而不仅仅是绕过安全性-因此您可以编写一个函数,以导出所需的确切数据,或者编写可以接受各种选项的东西,只要它们可以符合严格的白名单。您需要检查两件事:
GRANT
数据库中的s 定义,但是该函数现在以超级用户身份运行,因此通常可以“超出范围”的表将可以完全访问。您可能不想让别人调用您的函数并在“用户”表的末尾添加行…我写了一篇有关此方法的博客文章,其中包括一些导出(或导入)满足严格条件的文件和表的函数的示例。
另一种方法是在客户端(即在您的应用程序或脚本中)进行文件处理。Postgres服务器不需要知道要复制到哪个文件,它只需吐出数据,然后客户端将其放在某个位置即可。
该COPY TO STDOUT
命令的基本语法是命令,而pgAdmin之类的图形工具将在一个漂亮的对话框中为您包装它。
在psql
命令行客户端有一个特殊的“元命令”之称\copy
,这需要所有相同的选项,“真正的” COPY
,但在运行客户端中:
\copy (Select * From foo) To '/tmp/test.csv' With CSV
请注意,没有终止;
,因为与SQL命令不同,元命令由换行符终止。
从文档:
请勿将COPY与psql指令\ copy混淆。\ copy调用COPY FROM STDIN或COPY TO STDOUT,然后将数据提取/存储在psql客户端可访问的文件中。因此,使用\ copy时,文件的可访问性和访问权限取决于客户端而不是服务器。
您的应用程序编程语言可能还支持推送或获取数据,但是由于无法连接输入/输出流,因此通常不能在标准SQL语句中使用COPY FROM STDIN
/ TO STDOUT
。PHP的PostgreSQL处理程序(不是 PDO)包括非常基本的功能pg_copy_from
和可与pg_copy_to
PHP数组进行复制的功能,这些功能对于大型数据集可能无效。
\copy
可以工作-那里的路径是相对于客户端的,不需要/不允许使用分号。看到我的编辑。
\copy
需要成为一线客。因此,您不会获得按所需方式格式化sql的美,而只是围绕它放置一个副本/函数。
\copy
是命令行客户端中的psql
特殊元命令。它无法在其他客户端(例如pgAdmin)中运行;他们可能会拥有自己的工具(例如图形向导)来完成这项工作。
有几种解决方案:
psql
命令psql -d dbname -t -A -F"," -c "select * from users" > output.csv
这具有很大的优势,您可以通过SSH使用它,例如ssh postgres@host command
-使您能够
copy
命令COPY (SELECT * from users) To '/tmp/output.csv' With CSV;
>psql dbname
psql>\f ','
psql>\a
psql>\o '/tmp/output.csv'
psql>SELECT * from users;
psql>\q
所有这些都可以在脚本中使用,但我更喜欢#1。
在终端中(连接到数据库时)将输出设置为cvs文件
1)将字段分隔符设置为','
:
\f ','
2)设置输出格式不对齐:
\a
3)仅显示元组:
\t
4)设置输出:
\o '/tmp/yourOutputFile.csv'
5)执行查询:
:select * from YOUR_TABLE
6)输出:
\o
然后,您将可以在以下位置找到您的csv文件:
cd /tmp
使用scp
命令复制它或使用nano编辑:
nano /tmp/yourOutputFile.csv
COPY
或\copy
正确地接近手柄(转换为标准CSV格式); 做这个?
这些信息并没有很好地表示。由于这是我第二次需要导出此内容,因此将其放在此处以提醒自己是否没有其他内容。
真正做到这一点的最佳方法(从PostgreSQL中提取CSV)是使用COPY ... TO STDOUT
命令。尽管您不想按照此处答案中所示的方式进行操作。使用该命令的正确方法是:
COPY (select id, name from groups) TO STDOUT WITH CSV HEADER
在ssh上使用非常有用:
$ ssh psqlserver.example.com 'psql -d mydb "COPY (select id, name from groups) TO STDOUT WITH CSV HEADER"' > groups.csv
非常适合通过ssh在docker内部使用:
$ ssh pgserver.example.com 'docker exec -tu postgres postgres psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
在本地计算机上甚至很棒:
$ psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
还是本地计算机上的docker内部?
docker exec -tu postgres postgres psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
还是在kubernetes集群中,通过HTTPS在docker中通过??:
kubectl exec -t postgres-2592991581-ws2td 'psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
如此多才多艺,很多逗号!
是的,我做了,这是我的笔记:
通过/copy
有效地执行psql
命令,用户可以在正在运行该命令的任何系统上执行文件操作1。如果连接到远程服务器,则很容易将执行系统上的数据文件复制psql
到远程服务器或从远程服务器复制数据。
COPY
以后端进程用户帐户(默认postgres
)在服务器上执行文件操作,文件路径和权限将进行相应检查和应用。如果使用,TO STDOUT
则绕过文件权限检查。
如果psql
未在希望最终生成CSV的系统上执行,则这两个选项都需要后续文件移动。以我的经验,这是最有可能的情况,当您主要使用远程服务器时。
通过ssh将TCP / IP隧道配置到远程系统以进行简单CSV输出更为复杂,但是对于其他输出格式(二进制),/copy
通过隧道连接执行本地更佳psql
。同样,对于大型导入,将源文件移动到服务器并使用COPY
可能是性能最高的选项。
使用psql参数,您可以像CSV一样格式化输出,但是有一些缺点,例如必须记住禁用分页器并且不获取标题:
$ psql -P pager=off -d mydb -t -A -F',' -c 'select * from groups;'
2,Technician,Test 2,,,t,,0,,
3,Truck,1,2017-10-02,,t,,0,,
4,Truck,2,2017-10-02,,t,,0,,
不,我只是想从服务器中获取CSV,而无需编译和/或安装工具。
psql
可以为您做到这一点:
edd@ron:~$ psql -d beancounter -t -A -F"," \
-c "select date, symbol, day_close " \
"from stockprices where symbol like 'I%' " \
"and date >= '2009-10-02'"
2009-10-02,IBM,119.02
2009-10-02,IEF,92.77
2009-10-02,IEV,37.05
2009-10-02,IJH,66.18
2009-10-02,IJR,50.33
2009-10-02,ILF,42.24
2009-10-02,INTC,18.97
2009-10-02,IP,21.39
edd@ron:~$
有关man psql
此处使用的选项的帮助,请参见。
新版本-psql 12-将支持--csv
。
--csv
切换到CSV(逗号分隔值)输出模式。这等效于\ pset格式csv。
csv_fieldsep
指定以CSV输出格式使用的字段分隔符。如果分隔符出现在字段的值中,则该字段将按照标准CSV规则以双引号引起来。默认值为逗号。
用法:
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv postgres
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv -P csv_fieldsep='^' postgres
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv postgres > output.csv
在pgAdmin III中,有一个选项可以从查询窗口导出到文件。在主菜单中,它是“查询”->“执行到文件”,或者有一个按钮执行相同的操作(这是一个带有蓝色软盘的绿色三角形,而不是只运行查询的普通绿色三角形)。如果您不是从查询窗口运行查询,那么我将按照IMSoP的建议进行操作,并使用copy命令。
我编写了一个名为的小工具psql2csv
,用于封装COPY query TO STDOUT
模式,从而生成正确的CSV。它的界面类似于psql
。
psql2csv [OPTIONS] < QUERY
psql2csv [OPTIONS] QUERY
该查询假定为STDIN的内容(如果存在)或最后一个参数。除这些参数外,所有其他参数都转发到psql:
-h, --help show help, then exit
--encoding=ENCODING use a different encoding than UTF8 (Excel likes LATIN1)
--no-header do not output a header
我强烈建议您使用JetBrains的数据库IDE DataGrip。您可以将SQL查询导出到CSV文件,并且可以轻松设置ssh隧道。当文档提到“结果集”时,它们表示控制台中SQL查询返回的结果。
我与DataGrip无关,我只是喜欢这个产品!
JackDB是Web浏览器中的数据库客户端,它使此操作非常容易。特别是在Heroku上。
它使您可以连接到远程数据库并在它们上运行SQL查询。
来源
(来源:jackdb.com)
连接数据库后,您可以运行查询并导出为CSV或TXT(请参阅右下角)。
注意:我绝不隶属于JackDB。我目前使用他们的免费服务,并认为这是一个很棒的产品。
根据@ skeller88的请求,我将我的评论重新发布为答案,以免那些不读每个回复的人迷路。
DataGrip的问题在于它会夹住您的钱包。它不是免费的。在dbeaver.io上尝试DBeaver的社区版。它是面向SQL程序员,DBA和分析人员的FOSS多平台数据库工具,支持所有流行的数据库:MySQL,PostgreSQL,SQLite,Oracle,DB2,SQL Server,Sybase,MS Access,Teradata,Firebird,Hive,Presto等。
DBeaver Community Edition使得连接数据库,发出查询以检索数据,然后下载结果集以将其保存为CSV,JSON,SQL或其他常见数据格式变得很简单。它是TOAD for Postgres,TOAD for SQL Server或Toad for Oracle的可行的FOSS竞争对手。
我与DBeaver没有任何隶属关系。我喜欢价格和功能,但是我希望他们能更多地打开DBeaver / Eclipse应用程序,并使向DBeaver / Eclipse中添加分析小部件变得容易,而不是要求用户支付年度订阅费来直接在其中创建图表。应用程序。我的Java编码技能很生疏,我不想花数周的时间重新学习如何构建Eclipse小部件,却发现DBeaver禁用了向DBeaver Community Edition添加第三方小部件的功能。
DBeaver用户是否对创建要添加到DBeaver社区版的分析窗口小部件的步骤有了解?
import json
cursor = conn.cursor()
qry = """ SELECT details FROM test_csvfile """
cursor.execute(qry)
rows = cursor.fetchall()
value = json.dumps(rows)
with open("/home/asha/Desktop/Income_output.json","w+") as f:
f.write(value)
print 'Saved to File Successfully'