shell脚本连接、读写、操作mysql数据库实例
本文介绍了如何在shell中读写mysql数据库。主要介绍了如何在shell中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为xml或html文件,并分析了核心语句。本文介绍的方法适用于PostgreSQL,相对mysql而言,shell中读写PostgreSQL会更简单些。
1.连接mysql数据库
shell中连接数据库的方法很简单,只需要指定用户名,密码,连接的数据库名称,然后通过重定向,输入mysql的语句,如下所示:
mysql-uUSERNAME-pPASSWORDDATABASENAME<<EOF2>/dev/null showdatabases; EOF
但这并不是一个好办法,任何使用该脚本的用户都能看到该数据库用户的账号和密码,要解决这个问题,可以用mysql数据库的一个特殊配置文件。mysql数据库使用$HOME/.my.cnf文件来读取特殊的启动命令和设置。其中一项设置是由该用户账户发起的mysql会话的默认密码。要在这个文件中设置默认密码,可以加入下面的内容:
[client] password=123456 然后,别忘了修改权限: chmod400 .my.cnf 这样就可以通过脚本访问mysql数据库了,如下所示: #!/bin/bash MYSQL=`whichmysql` $MYSQLtest-uroot<<EOF showdatabases; showtables; select*fromemployeeswheresalary>4000; EOF
2.创建数据库
通过上面的方法连接数据库,再通过重定向输入mysql语句,shell中读写mysql基本就介绍完了。只要把sql语句写对了,通过重定向执行即可,下面来看一个实例:
#!/bin/bash ############################## #@filecreate_db_mysql.sh #@briefcreatedatabaseandtablesinmysql #@authorMingxingLAI #@version0.1 #@date2013-01-20 ############################## USER="root" DATABASE="students" TABLE="students" ###################### #cratedatabase mysql-u$USER<<EOF2>/dev/null CREATEDATABASE$DATABASE EOF [$?-eq0]&&echo"createdDB"||echoDBalreadyexists ###################### #createtable mysql-u$USER$DATABASE<<EOF2>/dev/null CREATETABLE$TABLE( idint, namevarchar(100), markint, deptvarchar(4) ); EOF [$?-eq0]&&echo"Createdtablestudents"||echo"Tablestudentsalreadyexist" ###################### #deletedata mysql-u$USER$DATABASE<<EOF2>/dev/null DELETEFROM$TABLE; EOF
这个脚本比较简单,就是几条SQL语句,没什么好解释的,下面来看一下,如何读入csv文件,然后插入到mysql数据库中。
3.插入csv文件
上面创建了一个学生表,表中有学生的学号,姓名,成绩,系别,假设有一个csv文件,内容如下:
$catdata 1,NavinM,98,CS 2,KavyaN,70,CS 3,NawazO,80,CS 4,HariS,80,EC 5,AlexM,50,EC 6,NeenuJ,70,EC 7,BobA,30,EC 8,AnuM,90,AE 9,Sruthi,89,AE 10,Andrew,89,AE
为了将csv文件插入到数据库,我们需要逐行读入,然后给字符串加上双引号,最后生成语句如下:
insertintostudentsVALUES(1,"NavinM",98,"CS");
要解析csv文件,最好的工具莫过于awk了,将域的分隔符指定为逗号-F,,awk就自动将各个域拆分出来了,然后在需要双引号的地方打印输出一个双引号,就能够轻松得到下面这样的数据:
1,"NavinM",98,"CS"awk代码如下: query=`echo$line|awk-F,'{printf("%s,\"%s\",%s,\"%s\"",$1,$2,$3,$4)}'` statement=`echo"INSERTINTO$TABLEVALUES($query);"` echo$statement
当然了,你也可以用其他办法,不过,几乎没有比awk更简单的了,第2种方法如下:
oldIFS=$IFS IFS=, values=($line)
values[1]="\"`echo${values[1]}|tr'''#'`\"" values[3]="\"`echo${values[3]}`\""
query=`echo${values[@]}|tr'#'','` IFS=$oldIFS
statement=`echo"INSERTINTO$TABLEVALUES($query);"` echo"$statement"