免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6938 | 回复: 7
打印 上一主题 下一主题

用shell脚本保存数据库查询结果的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-06 21:52 |只看该作者 |倒序浏览
system:fc4
db:postgresql-8.1.4

在windows下执行一个数据库查询备份:
copy (select * from tablea where condition)  to 'd:/bkfile'    该文件的内容如下:
14052206001        1405220600109379        \N        2007-05-22
14052200004        1405220000404241        2007-05-22 08:55:51        2007-05-22

以下是在linux中的备份查询sh:
#! /bin/sh
psql -d RealtimeInfo -U postgres > /root/tbtime <<-EOF
        select *from tablea where condition;
EOF
tbtime的文件内容如下:
   mineid    |      cardid      |      entertime      |  holddate  
-------------+------------------+---------------------+------------
14052200004 | 1405220000404124 | 2007-05-22 08:55:21 | 2007-05-22
14052200004 | 1405220000404241 | 2007-05-22 08:55:51 | 2007-05-22

使用copy的命令将文件回复到数据库中后,windows下测试的结果是bkfile文件中每一列数据恢复到数据库表相应的字段中,
但是linux下的测试结果是:整个文件的内容都恢复到数据库表的第一个字段,即:mineid中。不是对应的字段中。

为什么会出现这种情况?
相同的查询结果,bkfile的文件内容格式和tbtime的内容格式却不一样?

请各位高手多多指教!

论坛徽章:
0
2 [报告]
发表于 2007-08-07 01:50 |只看该作者
正确啊,分隔符不同.你试试:
echo "        select mineid from tablea where condition;
"|psql -d RealtimeInfo -U postgres > /root/tbtime

论坛徽章:
0
3 [报告]
发表于 2007-08-07 20:53 |只看该作者

回复 #2 zhangshebao 的帖子

好象不行吧,执行的时候出错:
line 2: echo select mineid,cardid,entertime,holddate from hisrealresult where holddate > '2007-05-01' and holddate < '2007-06-01';: command not found

论坛徽章:
0
4 [报告]
发表于 2007-08-07 22:01 |只看该作者
那你的写法测试结果一样。
从数据库输出的时候可以指定文件的输出格式么?
谢谢

论坛徽章:
0
5 [报告]
发表于 2007-08-07 22:12 |只看该作者
1楼说结果到了第1个第段,我看不象,所以让你仅选第1个字段。
3楼少引号所以出错,而且选了全部字段达不到测试目的。
字段对错了是导入不对;字段正确,输出格式不对需要指定输出格式或作格式转换。
如何指定输出格式,要去了解psql用法。
我让你测试的是验证你说的“但是linux下的测试结果是:整个文件的内容都恢复到数据库表的第一个字段,即:mineid中。不是对应的字段中。
”是否正确。

论坛徽章:
0
6 [报告]
发表于 2007-08-07 22:19 |只看该作者
如果数据库数据正确,又不会指定格式,就用格式转换:
echo "        select * from tablea where condition;
"|psql -d RealtimeInfo -U postgres |sed -e 's/ | /\t/g'> /root/tbtime

论坛徽章:
0
7 [报告]
发表于 2007-08-07 22:43 |只看该作者

回复 #6 zhangshebao 的帖子

看来是文件分割符的问题:
把tbtime中的“|”分隔符全部替换成“Tab”制表符后,保存在tbtime文件中的数据通过copy命令可以恢复到目标数据表相应的字段中。

这样的话,通过什么命令可以对tbtime文件中的“|”进行替换,我在做测试的时候是手动进行的。

谢谢!

论坛徽章:
0
8 [报告]
发表于 2007-08-07 23:25 |只看该作者
按6楼的提示可以指定输出字段的分隔符。

多谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP