显示标签为“Database”的博文。显示所有博文
显示标签为“Database”的博文。显示所有博文

2013年1月29日星期二

MongoDB : 用mongoexport导出collection数据为json文件

mongoexport -usomeuser -psomepasswd --host xxx.xxx.xxx.xxx --port 27017  -d somedb -c somecollection  -q "{'somecol' : 'someval'}" -o collection_file.json

2013年1月6日星期日

MongoDB : 自定义函数在客户端shell调用和在server端调用,数据传输的差别


在server端定义了一个函数somefunc,把mapreduce的结果从 _id , value 的形式 flatten 展开


db.system.js.save({
_id : 'somefunc',
value : function(src_mr, dst_name){
d = db.createCollection(dst_name);
var src = db[src_mr];
var d = src.find();
var dst = db[dst_name];
while (d.hasNext()) {
var r =d.next();
var x = r._id;
x.value = r.value;
// some modify on x ....
dst.insert(x);
}
}
});



在客户端执行运算:


db.loadServerScripts();
somefunc('srcmr', 'dstmr');

会把srcmr的数据传回客户端,在客户端的机器算好了,再远程写入mongodb server,抓包可以看到网络流量较大。

在server端执行运算:


db.eval("somefunc('srcmr', 'dstmr');");

不会把数据传回客户端,而是在服务端mongdb进行计算,直接写入,抓包可以看到网络流量很小。



因此,可以在客户端调试小规模数据,实际应用时在server端db.eval执行。


2013年1月5日星期六

MongoDB : findOne 跟 find

findOne是返回一个object
x = db.sometable.findOne();

find是返回一个cursor,要用next() 才能取出真正的数据
cur = db.sometable.find().limit(1)

x = cur.next()

用forEach循环处理:
db.sitelog.find().limit(10).forEach(

function(r) {

t = somefunc(r);

printjson(t);

}

);

用while循环处理,有时候会提示db not response 错误退出,超时设为-1也无效
while(cur.hasNext()){

r = cur.next();

t = somefunc(r);

printjson(t);

}

 

 

MongoDB : db.loadServerScripts(); 载入的函数调用split失败的问题


服务器定义某个函数

db.system.js.save({
_id : 'somefunc',
value :
function(d) {
// ....
s = split(/\s+/, somestring);
// ...
});

调用somefunc函数时,会提示不能做split:
db.loadServerScripts();
somefunc(somedata);

把 s = split(/\s+/, somestring); 改成 s = somestring.split(/\s/+); 就行了

2011年6月1日星期三

Head First SQL

指定某个列默认值建表:  test_column varchar(100) NOT NULL DEFAULT ‘’

_ 指定单个任意字符查询:select * from test_table where test_column like ‘_ttt’;

坚持到200页,实在撑不住了,图太多,看的眼花,放弃了。

2011年3月13日星期日

PostgreSQL : 在windows下的安装配置

1、安装

下载安装包,语言要选"简体中文,新加坡"的,不然后面服务安装会失败。

2、配置

切换用户:runas /noprofile /env /user:postgres "cmd"

进入命令界面:psql

建数据库:create database mydb;

建新用户:create user someuser password 'somepassword';

授权:


 
GRANT ALL PRIVILEGES ON database somedb TO someadmin;

 
REVOKE ALL PRIVILEGES ON somedb from someadmin;
GRANT select ON somedb.sometable TO someuser;

3、其他

备份数据库:pq_dump somedb > somedb.dump

恢复数据库:psql -d somedb -f somedb.dump

2011年1月2日星期日

CodeIgniter + Mysql : 中文表单乱码问题

上周用CodeIgniter搞了2个简单的前台页面,发现表单传中文内容正常,往Mysql的表里写的时候总是乱码。

折腾了一阵,总算搞定,参考资料如下:

配置说明:

mysql编码配置:

mysql_charset.png

mysql建表命令:

   create table sometable (
   id int unsigned,
   user varchar(30),
   test text);

CodeIgniter的system\application\config\config.php中设置:

codeigniter_config_charset.png

CodeIgniter的system\application\config\database.php设置:

codeigniter_db_charset.png

使用说明:

  • php文件的编码是gb2312,用 $this->db->insert($table, $data); 往表里插数据是正常的gb2312编码。
  • perl脚本的编码是gb2312,用DBI连接数据库时不用显式指定编码,可直接取回表中gb2312编码的内容。

2010年12月6日星期一

笔记 : Perl DBI

Storable模块:nfreeze比freeze慢,但是保证可跨系统使用

Fcntl的flock

DB_FILE可以有三种存储形式 HASH、B树、RECNO(文本)

MLDBM 支持将复杂的数据结构写入文件

DBI的PrinterError对应warn,RaiseError对应die

错误消息:$DBI::errstr

quote函数自动转义引号

trace函数指定输出DB操作详情,debug用

dump_results打印执行结果,指定写入文件

bind_param_inout指定输出的参数写入到什么变量

bind_col

$sth->{NUM_OF_FIELDS}返回的列数

$sth->{NAME}->[$i-1] 第i列的名字

AutoCommit如果设为0,在执行一系列操作后,$dbh->commit(); if($@) { $dbh->rollback(); },较稳妥。

ODBC标准化了错误码,支持更多函数操作

DBI PROXY : 转发client的query给db,把db返回的结果转给client,这样中转一下,unix机器就能访问windows access的数据库

2010年11月21日星期日

笔记 : SQL Cookbook

连接字符串: concat

条件逻辑: select col_a, case when col_b<100 then 'small' else 'big' end as state from sometable

按某个字段的最后两个字符升序:select col_a,col_b from sometable order by substring(col_b, length(col_b)-2)

重叠结果输出:[SELECT SQL A] union all [SELECT SQL B]

union all不删重复项;union删重复项;除非必要,否则不要用union、distinct

从一个表中取数据导入另一个表:insert into table1(col_a, col_b) select (col_aa, col_bb) from table2 where colcc='somevalue'

出现三次以上部门:select col_a from sometable group by col_a having count(*)>=3

列出索引:show index from emp

正则:select data from sometable where data regexp '[^0-9]' = 0

将同一部门的人名合在一行显示:select dept, group_concat(name order by id, ',') from emp group by dept

滚动结果集,每页五行(limit 5),显示第2页(offset 5):select col_a from sometable order by col_a limit 5 offset 5