马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
本文介绍了如何在shell中读写mysql数据库。主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为xml或html文件, 并分析了核心语句。本文介绍的方法适用于PostgreSQL ,相对mysql而言,shell 中读写PostgreSQL会更简单些。 1. 连接mysql 数据库 shell中连接数据库的方法很简单,只需要指定用户名,密码,连接的数据库名称,然后通过重定向,输入mysql的语句,如下所示:
0 k2 Z0 e) V8 B- e [url=]复制代码[/url]代码如下:
# U* Q; N y( X1 wmysql -u USERNAME -p PASSWORD DATABASENAME <<EOF 2>/dev/null$ k @2 p- N u
show databases;6 T! A$ `5 a% M# w7 x3 }
EOF
9 |, t$ t( w# q) N4 D1 X) S; T( S: r$ X7 A1 H8 M5 z9 R3 q
但这并不是一个好办法,任何使用该脚本的用户都能看到该数据库用户的账号和密码,要解决这个问题,可以用mysql 数据库的一个特殊配置文件。mysql 数据库使用$HOME/.my.cnf 文件来读取特殊的启动命令和设置。其中一项设置是由该用户账户发起的mysql 会话的默认密码。要在这个文件中设置默认密码,可以加入下面的内容:6 D0 m! S) L/ y6 C. [; |+ j
[url=]复制代码[/url]代码如下:
9 m5 g2 u" d7 K T$ p# T U
+ u8 E: H! d# P% F[client]
8 s3 N7 e$ N: d6 j M$ r( ipassword = 123456
& r( O2 V8 K3 N F$ C然后,别忘了修改权限:( D( u6 Q4 Y X6 \
chmod 400 .my.cnf
+ M- x, K+ ~' V7 w这样就可以通过脚本访问mysql数据库了,如下所示:
, T+ g1 R n @6 \/ L+ s; M#!/bin/bash0 `" [4 {* }1 y. X8 N- a8 d
MYSQL=`which mysql`9 _6 K1 v# X% I1 P& o: D) ?5 j
$MYSQL test -u root << EOF
1 m8 f7 p3 D) A$ i1 x- B9 ^) Nshow databases;
1 g! R! a u1 Q4 ?2 oshow tables;* n6 n; d- P) k6 [: z7 a
select * from employees where salary > 4000;3 Z' P$ e2 A* r" ^5 ^6 y: \; x! E! J0 q6 D
EOF% y/ x4 O+ R* y
/ M% W# a/ [' @- W2 }4 t
, }4 K9 K# z9 N5 A5 ?! a8 f I d1 V
2. 创建数据库 通过上面的方法连接数据库,再通过重定向输入mysql语句,shell中读写mysql基本就介绍完了。只要把sql语句写对了,通过重定向执行即可,下面来看一个实例:
% c, n/ T( y, G# M- } [url=]复制代码[/url]代码如下:. e1 n$ E! U7 j" v+ ^ N9 V
* R, i8 ^4 V d9 g#!/bin/bash
( j2 f' R3 I7 [3 h##############################
1 v g% C1 b6 p7 `+ O8 r$ x# @file create_db_mysql.sh
! Y) r) p& z" f# @brief create database and tables in mysql
% S p+ L3 F& K# ^- w4 A, n# @author Mingxing LAI
0 K! L6 W' J2 O# @version 0.1
8 ]# | g- [0 h) D- ~& }5 ~/ ~# @date 2013-01-20
; n% \& J( E+ q3 c3 b* Y; d##############################
& f3 }+ g" Q! I9 h/ w: _$ LUSER="root"7 n4 P1 N8 r! \$ u
DATABASE="students"
, `! L# C: r7 b# G6 k) M) |! M: F2 cTABLE="students"
# C0 U; Y9 N2 V, H, l######################
4 ^7 f& p( Z$ y: q* C6 o4 P6 P#crate database/ B: R/ z) t7 Z q
mysql -u $USER << EOF 2>/dev/null
0 Q! Z. v% A7 g4 }/ RCREATE DATABASE $DATABASE
7 N. \5 \. g( T9 R0 F' S3 gEOF5 w/ ~, x* \' l1 `) x0 O! w0 a
[ $? -eq 0 ] && echo "created DB" || echo DB already exists
/ c* U% v( s* I######################" w+ K1 `5 o! ~+ _3 I
#create table& y" n2 ]; a7 t! C6 b9 j
mysql -u $USER $DATABASE << EOF 2>/dev/null* r2 f4 N7 D+ i3 G1 G0 H& X6 n
CREATE TABLE $TABLE(; h# _, A8 S+ p: d. U5 I! {
id int,* Z/ V$ t9 T3 c) b( Z9 H
name varchar(100),
: W% c2 E @; x; m; v, W; omark int,# e) a1 q* T- l( F- Z% V& @' P) ]5 K
dept varchar(4)
. k2 G0 p( F: S4 s( W- U! U);) J6 J( Y7 b" Q' G7 U
EOF$ Y% [7 A' F% N
[ $? -eq 0 ] && echo "Created table students" || echo "Table students already exist" $ I+ x& V$ V) V/ L T R; ]
######################6 Z# X1 z$ {) L3 E& n
#delete data! ?4 d1 C% P h0 ] Z; N
mysql -u $USER $DATABASE << EOF 2>/dev/null
1 l6 x" l R& @. a1 a0 ?DELETE FROM $TABLE;8 H4 j, Q7 _3 M
EOF( {" a; F4 x9 P( Z
1 b- t2 T5 i" O
这个脚本比较简单,就是几条SQL语句,没什么好解释的,下面来看一下,如何读入csv 文件,然后插入到mysql数据库中。 3. 插入csv 文件 上面创建了一个学生表,表中有学生的学号,姓名,成绩,系别,假设有一个csv文件,内容如下:
6 P. d, {; G/ [) A) c [url=]复制代码[/url]代码如下:9 c! K! c# c' o, Y7 _4 l2 g1 a
$cat data* G$ X2 O' o2 H" ]6 [2 F8 i9 S* Q
1,Navin M,98,CS
- _( w7 f+ u! Q" g2,Kavya N,70,CS1 ~! }* u/ f9 j6 e8 i- t1 s
3,Nawaz O,80,CS
) z6 ?5 [) B! w, C: h5 t4,Hari S,80,EC. z( u4 y1 q5 {
5,Alex M,50,EC
) [, K' A+ |1 E B% y: B+ C6,Neenu J,70,EC
7 S) U Q. N. C7 m% j* n( y6 d7,Bob A,30,EC
$ x+ w' u/ }; q8,Anu M,90,AE |2 \/ O i/ k( ? q8 J/ w7 y
9,Sruthi,89,AE
+ a/ I# O0 s" D10,Andrew,89,AE
; y9 [1 y% A$ Y |4 g2 U& q5 \( W: K$ S8 l
4 y3 d$ i7 @2 O. J% t0 i) X* f为了将csv 文件插入到数据库,我们需要逐行读入,然后给字符串加上双引号,最后生成语句如下:
1 P. v/ Q) @0 U7 h, T( j[url=]复制代码[/url]代码如下:
1 z# a6 d# `3 S( E+ h
1 F N' ~7 L+ {insert into students VALUES(1, "Navin M", 98, "CS");: f! e+ L9 v- y, @# M
9 O: n9 q& p; W4 `" ^2 \3 Y
4 x% b. g2 |. T, C' } Y要解析csv 文件,最好的工具莫过于awk了,将域的分隔符指定为逗号-F,,awk就自动将各个域拆分出来了,然后在需要双引号的地方打印输出一个双引号,就能够轻松得到下面这样的数据:* R) m" C7 g6 w" c/ s' X K
[url=]复制代码[/url]代码如下:
3 L+ T+ @9 @7 V" ~- N4 f1, "Navin M", 98, "CS" awk 代码如下:5 m R/ p; ?4 t3 `2 [3 s* x) b
query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`
/ f9 U) i1 D6 D! G$ c% F& ^statement=`echo "INSERT INTO $TABLE VALUES($query);"`# E f0 o, h) T0 d* r) C9 s4 P. |
echo $statement
0 c2 T) [) V) {0 ~" m/ L3 r2 J* R6 F% N
当然了,你也可以用其他办法,不过,几乎没有比awk更简单的了,第2种方法如下:' t; C0 i) ]5 F+ a
[url=]复制代码[/url]代码如下:
& ^/ ]6 L7 J* a+ S2 x8 D. h3 L2 F
, ]8 F {" D5 e4 t# Q) b! w3 O2 |oldIFS=$IFS
) p9 y, h. h7 c$ v3 i: n- pIFS=,4 Y* H, a1 t" P; F! v
values=($line)' A* }. n% `- l5 |2 j8 g
values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""* H8 }3 a2 g( G) Y8 z
values[3]="\"`echo ${values[3]}`\"" query=`echo ${values[@]} | tr ' #' ', '`& c3 s6 j& E. a. g4 h9 Z
IFS=$oldIFS statement=`echo "INSERT INTO $TABLE VALUES($query);"`
% a( c6 U5 G$ y4 Yecho "$statement" i: p% M* C$ f, f- N, A
4 n% e: i$ n4 f6 p6 J* G! y* f6 I# l, a( Q& \- j6 @( B2 F
首先通过指定域分隔符,将csv文件解析成一个数组,然后将空格替换成一个特殊的符号"#"(因为后面的替换中,会一次性输出数组,而数组是用空格分隔各字段,我们要将分隔数组的空格替换成逗号,所以这里将数据中的空格替换成"#") ,给字符串加上双引号,最后再把空格替换成逗号,把"#"替换为空格。这种方法真是让人抓狂,我第一次就没有看明白,尤其是为什么要将空格替换成"#"。
1 u. J4 N8 V3 e$ o, p; g4 e完整的插入数据的程序如下:
( P. W3 i6 W/ t; W0 r [url=]复制代码[/url]代码如下:
0 l3 U: T; R e) L/ S+ |& j7 A1 I) z! l# [
#!/bin/bash
' E$ G/ w( ?4 D1 O& z- b#
1 H# ]7 ^+ x; r$ R5 L& ?# @file write_to_db_mysql.sh
. Z( m" N4 s# i& w" v) o' _# @brief wirte data to database in mysql* Y. ]0 P% c8 V7 v3 W
# @author Mingxing LAI! `0 K! f5 K x# \+ q$ N
# @version 0.1
) J# \$ F1 I+ Z0 D: z# @date 2013-01-20
) N* @1 f2 O5 G/ g% r/ v#/ \( `: c; O. a' j6 a9 D- v
USER="root"+ n4 b* t s, \% q) i# |9 h
DATABASE="students"
- y1 w+ ?5 {; w1 _( tTABLE="students"& H- |/ v5 n6 j: T# r
if [ $# -ne 1 ]; then; J0 e$ \; I! R2 \7 {
echo $0 DATAFILE m& P6 h- _- ^9 K- J; }
echo0 G$ k8 z7 j% K6 \" g
exit 2
# {7 b3 Z: u# M( F7 sfi8 r) k' \( r+ F0 O
data=$1+ Q* ]( p9 W; `+ ~* T
while read line;
Z9 N8 X0 H+ e1 cdo4 N5 `* [: s0 B, ~3 L
# query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`+ e7 E2 q7 G( L T& T& t* i
oldIFS=$IFS! `6 l) e7 b- {: B: Y
IFS=,
- m) s Q; f6 f9 ?/ `, A: |, N values=($line)
2 K" x. @, }8 ^ values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""& i8 {- ^7 S }; q5 G$ N
values[3]="\"`echo ${values[3]}`\""+ a; n5 c+ S0 M% G, [3 l; v
query=`echo ${values[@]} | tr ' #' ', '`
4 B5 y6 T% x. c$ q5 _6 d IFS=$oldIFS
- p/ l5 r, N+ f7 P, V3 n& U statement=`echo "INSERT INTO $TABLE VALUES($query);"`0 T8 y) G" g: t! [7 r
# echo $statement mysql -u $USER $DATABASE << EOF
/ d# W% g' C$ F+ q4 b INSERT INTO $TABLE VALUES($query);; K* G) B9 h1 g8 s* d
EOF+ x2 t0 u; N0 y9 d3 d
done < $data
1 b; }) q% w, y+ o- u' W0 i0 Lif [[ $? -eq 0 ]]; then
7 U4 C& }3 Y! @6 O. `+ v: {8 g# j echo "Wrote data into DB"+ n4 C& `% D4 P2 e
fi
) F X) F4 K$ A8 T/ Y5 c
. p: Y# A2 a& L5 K/ b/ u! q! @# V; g2 [5 ?/ C) I/ U% p
4. 读取数据 知道怎么在shell 中连接mysql ,也知道了怎么在shell中批量执行sql 语句,读取数据,就没有任何难度了。5 y* k f0 V3 _9 R8 W! G% `/ x5 H
[url=]复制代码[/url]代码如下:
0 \/ ^) M% ^. D. f( |#!/bin/bash
; ]+ `& F; ?/ t$ ~% t$ r. p; f#" b1 B5 r E7 Y% J, M9 O8 E0 ?
# @file read_db_mysql.sh
u3 f. q+ |% n% H1 P. ~! S+ e9 ?# @brief read data from mysql/ }& P( q& A; E- f$ p( u+ D
# @author Mingxing LAI. F( J( z$ R% }& x% e
# @version 0.1; y, m# l) k& r: m R7 B) g, `2 U
# @date 2013-01-20, n. F3 d; x1 n q* ~: y
#; K+ I8 l& N. G2 a, H, |
USER="root"% H. `+ l/ N$ n* ?; L4 ]: R
DATABASE="students"1 {7 u6 c5 p# ~5 n8 X( @/ Z X2 L
TABLE="students" #用tail 去掉表头
- \: z& e/ C6 D, Y4 H' Xdepts=`mysql -u $USER $DATABASE <<EOF | tail -n +2
8 v! t# i/ ]: Z5 eSELECT DISTINCT dept FROM $TABLE;9 z% D% g8 f! `! e
EOF` for d in $depts; do
' s& w, \/ Z% B7 a) h3 g$ O echo Department: $d3 X; E& J5 C3 N: y3 D; V4 S' }
result="`mysql -u $USER $DATABASE << EOF0 \5 Z' e" P7 a4 S! a: y
set @i:=0;- S6 s ~, j# k$ R3 Q
SELECT @i:=@i+1 as rank, name, mark FROM students WHERE dept="$d" ORDER BY mark DESC;
x7 G0 ?- |$ |' ]" D4 e: TEOF`" echo "$result"; y- P$ G) R' Z: H8 H8 ~
echo
+ q. r- r* S4 \5 Ddone, S' ~, \8 k' W# n6 t+ _" q
' k; ]3 w( N& j3 d+ K; U7 e8 A# ]; c, G: b3 }1 I2 }7 P2 |
我们还可以在mysql语句中,使用选项来控制数据的输出格式7 \2 a a- w1 T3 r/ w" o
-H 输出为html5 w+ x% _$ k! ?
-X 输出为xml 如下所示:
( N: _% s4 s5 C! C [url=]复制代码[/url]代码如下:# Q/ s T2 H. F6 e1 V/ s
V; k5 ~# r$ H# Z9 ]
#!/bin/bash
; ?% C* s0 d" I/ K3 JUSER="root"0 }# v, N4 s; F$ n2 }
DATABASE="students"
/ }8 d% W7 I, U: ~TABLE="students"/ J7 {( T* G' [) E) p5 j
mysql -u $USER $DATABASE -H << EOF. r/ b3 ] K5 W) ^
select * from $TABLE
( t( P5 d: m/ V6 ?$ ?7 q& iEOF/ N9 `3 S% h8 o8 g: B) R( b
# _8 ?. Q. k1 W5 O t7 ]5 d, y0 _! v5 [1 J5 _
html 格式的可读性比较差,输出效果如下: H" l( s5 R1 @$ @: t* d
[url=]复制代码[/url]代码如下:
: i# Z4 n" F. q' S<TABLE BORDER=1><TR><TH>id</TH><TH>name</TH><TH>mark</TH><TH>dept</TH></TR><TR><TD>1</TD><TD>Navin M</TD><TD>98</TD><TD>CS</TD></TR><TR><TD>2</TD><TD> Kavya N</TD><TD>70</TD><TD>CS</TD></TR><TR><TD>3</TD><TD> Nawaz O</TD><TD>80</TD><TD>CS</TD></TR><TR><TD>4</TD><TD>Hari S</TD><TD>80</TD><TD>EC</TD></TR><TR><TD>5</TD><TD>Alex M</TD><TD>50</TD><TD>EC</TD></TR><TR><TD>6</TD><TD>Neenu J</TD><TD>70</TD><TD>EC</TD></TR><TR><TD>7</TD><TD>Bob A</TD><TD>30</TD><TD>EC</TD></TR><TR><TD>8</TD><TD>Anu M</TD><TD>90</TD><TD>AE</TD></TR><TR><TD>9</TD><TD>Sruthi</TD><TD>89</TD><TD>AE</TD></TR><TR><TD>10</TD><TD>Andrew</TD><TD>89</TD><TD>AE</TD></TR></TABLE>
' f p" W) c5 l) X& `0 s# \$ U% f: @& S3 T# }
可读性差也可以理解,因为人家觉得,你没必要修改么,直接以html形式展示数据就可以了。
4 E8 i. s; ~( v4 M[url=]复制代码[/url]代码如下:
_9 K' T) p9 kid name mark dept
! ~' n, E' ]" ]3 \- b1 Navin M 98 CS
3 N: L9 W" w. ]; b ~" B. b2 Kavya N 70 CS
" r2 E0 R. F# j$ F/ A6 K3 Q R1 X3 Nawaz O 80 CS
5 l5 B8 q0 L3 V: w. u3 f4 Hari S 80 EC' ?1 K9 s' }( Z* v+ S4 _2 b
5 Alex M 50 EC
F# ]- b! f! Q+ f% p6 Neenu J 70 EC. n3 c6 X& l0 D* X3 H4 q
7 Bob A 30 EC7 h( o5 F5 m9 N( f0 `8 n- o0 _' j
8 Anu M 90 AE3 G6 z1 U2 G8 F h
9 Sruthi 89 AE
3 y, \" J } ?. S8 ^5 C& a10 Andrew 89 AE" c m9 @! J( H8 L* s6 C- R
% s0 b& [5 t% r0 Q) W
0 C7 p$ @# a( j4 [+ z& l: Kxml形式的数据显示就比较正常了,直接将上面的-H 换成-X,输出如下:" G* {8 b, h* P
[url=]复制代码[/url]代码如下:& y' B8 A1 w! Q; P1 S. L1 M
<?xml version="1.0"?>
" Z! j" `2 Y9 `# S( K<resultset statement="select * from students" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
6 m5 P% ^) R" t <row>
/ c o2 p# M# w- m; Z2 Z5 { O/ U3 _ <field name="id">1</field>1 D4 H$ ?; n1 B. f
<field name="name">Navin M</field>; x. |1 b) y9 o$ b7 @; W
<field name="mark">98</field>% D. X+ E3 K% D: k, T2 Z7 ^: k
<field name="dept">CS</field>
: j6 D8 n8 [4 h G3 @ </row>6 `; S6 L# K' V. t8 B$ `
<row>
, ?2 E a' C0 [ z9 { <field name="id">2</field>4 t" Z5 z; z$ n% u: o) |- @. |4 G
<field name="name"> Kavya N</field>
5 z2 d% @! a' E7 w/ p& \ <field name="mark">70</field>
7 K, Z5 }6 O* P& F5 m( o6 F <field name="dept">CS</field>
U) e4 e" e5 i/ I4 a2 {$ s# j, L </row>2 W5 E$ M, T( b4 T
</resultset>9 g9 t& t, a; e) `9 `
4 n8 C# C$ r5 L
/ d! t v. {& x完。
3 @0 A+ W/ }, k" D |