马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
本文介绍了如何在shell中读写mysql数据库。主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为xml或html文件, 并分析了核心语句。本文介绍的方法适用于PostgreSQL ,相对mysql而言,shell 中读写PostgreSQL会更简单些。 1. 连接mysql 数据库 shell中连接数据库的方法很简单,只需要指定用户名,密码,连接的数据库名称,然后通过重定向,输入mysql的语句,如下所示:
. S" O' ]5 q) ]6 U0 ~) G6 |2 Y [url=]复制代码[/url]代码如下:+ g7 B7 v! X. J
mysql -u USERNAME -p PASSWORD DATABASENAME <<EOF 2>/dev/null$ A/ u3 ?* n" ]
show databases;( V9 i4 k4 K1 l9 {" d {2 d
EOF* Y2 a( r7 e- Q# y( `; x
! D1 H6 M; J/ x$ S' e2 M, G
但这并不是一个好办法,任何使用该脚本的用户都能看到该数据库用户的账号和密码,要解决这个问题,可以用mysql 数据库的一个特殊配置文件。mysql 数据库使用$HOME/.my.cnf 文件来读取特殊的启动命令和设置。其中一项设置是由该用户账户发起的mysql 会话的默认密码。要在这个文件中设置默认密码,可以加入下面的内容:7 o7 k1 P6 R' T
[url=]复制代码[/url]代码如下:
1 `4 M; h( J9 R. x
( L1 ^" n+ y* y) ?4 V" I[client]
" w& D1 e9 w' R0 Y* _password = 1234562 @5 y( W- [% m1 m6 F2 P
然后,别忘了修改权限:
- n; o6 f3 {. M' [; t( Jchmod 400 .my.cnf
- Y, w W$ ]2 g( ~ ?5 P+ U这样就可以通过脚本访问mysql数据库了,如下所示:1 b/ |6 X- i% Q- I. b) Q7 M
#!/bin/bash* z. q- L8 F, o7 ^( h
MYSQL=`which mysql`6 W2 A& p' O& P: W
$MYSQL test -u root << EOF; u2 j# c' r3 g- o: ^+ v, _
show databases;
: `1 ~2 N: J8 Fshow tables; L3 n. E; @. w7 l5 Z
select * from employees where salary > 4000;
: w5 n P$ c$ U) {8 \' y! u3 e6 \EOF
8 E* z9 p% b2 h3 w c& g) D, d6 n0 d+ b: {8 w& j
* C- K: H: R* m m3 y: k; Q* y$ `
2. 创建数据库 通过上面的方法连接数据库,再通过重定向输入mysql语句,shell中读写mysql基本就介绍完了。只要把sql语句写对了,通过重定向执行即可,下面来看一个实例:
( n% R1 o2 Z! p6 j4 o- w [url=]复制代码[/url]代码如下:$ L/ M: @ N: r2 e& y2 w3 L
1 ^; T/ G+ h U* @. p" L* r ^% k
#!/bin/bash# }6 @7 G0 k9 f+ J5 k
##############################9 {& B' E/ u% {' ?
# @file create_db_mysql.sh
+ t- v/ x! L! z: E# @brief create database and tables in mysql+ t& j6 j8 T }6 a V: f4 j
# @author Mingxing LAI
) r% q9 ~: k+ n9 D6 n/ W' |7 {# @version 0.1& r* Q \, }- l/ B) O
# @date 2013-01-20' _5 c- ^, P+ R: a' G! o6 {
##############################
0 W. S& R/ L5 y$ ]; BUSER="root"! P3 L) {2 x I" m4 K
DATABASE="students"6 z( ?) U2 i+ V; \4 w4 S0 [4 N
TABLE="students"8 @+ I- k5 w1 v
######################+ {0 r1 s1 v' ^) s' j+ `2 f
#crate database. ]/ o5 C& K, ]( l5 m: L; D' w
mysql -u $USER << EOF 2>/dev/null
6 B3 ~2 ]; j. g% U7 n( }CREATE DATABASE $DATABASE; }+ m j' ~0 j) c u
EOF2 K8 n+ V" M% Y ]; `5 y
[ $? -eq 0 ] && echo "created DB" || echo DB already exists
# M0 Q' v; \5 F4 I1 a3 A1 _######################0 F; Q* K; @+ [+ {2 B4 s
#create table
2 t2 ^; J( h8 ?2 O5 ]mysql -u $USER $DATABASE << EOF 2>/dev/null
: B" H5 U6 r- D" u8 l9 m. qCREATE TABLE $TABLE(& ~+ K- Y; S% p' Y0 k7 D( h
id int,0 p6 v, V% H' H; _3 L
name varchar(100),
6 p9 I% ]6 G! ?0 G+ J! Y/ Wmark int,
n- B! u( U* D# T5 L! b5 xdept varchar(4)
$ O, |% S) H1 }' |! o);! j: C& U9 }8 l9 T1 }
EOF8 I3 `/ p4 j$ z! z) M$ h! g
[ $? -eq 0 ] && echo "Created table students" || echo "Table students already exist"
( B S0 w* h: f, \+ `5 A! T+ }######################7 Q; P3 z0 ?' b
#delete data
' W) W6 C6 g' r3 [mysql -u $USER $DATABASE << EOF 2>/dev/null y. w% [2 ^7 h; ^0 F+ D: W' [
DELETE FROM $TABLE;
$ d6 t* W' t+ [4 y3 m1 _1 X, XEOF
* @) d. ^6 T* q' \3 ?/ m; B+ L5 C/ [
这个脚本比较简单,就是几条SQL语句,没什么好解释的,下面来看一下,如何读入csv 文件,然后插入到mysql数据库中。 3. 插入csv 文件 上面创建了一个学生表,表中有学生的学号,姓名,成绩,系别,假设有一个csv文件,内容如下:7 w% L& @+ Q+ _, y2 R( l
[url=]复制代码[/url]代码如下:; G n% `8 [. [& W
$cat data
" U& L' p7 \& m5 e1,Navin M,98,CS* ^0 s+ @* D7 J R
2,Kavya N,70,CS
: P. B ^ F. n4 ^' Y7 x3,Nawaz O,80,CS
; O2 l T: @+ s- ]4 [6 N/ R4,Hari S,80,EC
" w; s' ?2 ~% r5,Alex M,50,EC
6 K% t; V, [1 }/ n6,Neenu J,70,EC0 ~+ j& _! n# u! K* R7 B$ K2 v
7,Bob A,30,EC0 w+ @- j7 P+ K+ p; f' {% f, O$ C
8,Anu M,90,AE% c, ?: T$ @" M g6 J0 K+ O
9,Sruthi,89,AE/ C- B# U0 h( {& W: u/ i8 W
10,Andrew,89,AE
% g8 F. x3 p0 `- t& L. N$ X) _6 t% i$ ?- c) G. o, U; \# {
! W4 D( V) N# W6 \7 z( {% x( J
为了将csv 文件插入到数据库,我们需要逐行读入,然后给字符串加上双引号,最后生成语句如下:( H! n" u3 H5 n ?. S/ l; K% Z3 g
[url=]复制代码[/url]代码如下:. R" J3 H& s4 e
+ c' g% N$ F2 x5 J4 u8 m3 |5 R/ f' M) e
insert into students VALUES(1, "Navin M", 98, "CS");0 L" |, g; V9 _1 S4 C" _
, ?- n/ H( T. D; T9 _
5 |! |& ]( H" r# x4 z* I4 }$ \要解析csv 文件,最好的工具莫过于awk了,将域的分隔符指定为逗号-F,,awk就自动将各个域拆分出来了,然后在需要双引号的地方打印输出一个双引号,就能够轻松得到下面这样的数据:
/ @; k1 t8 K- z" ~. f[url=]复制代码[/url]代码如下:$ K+ g9 ?+ W( j0 \+ D- s' k
1, "Navin M", 98, "CS" awk 代码如下:% y1 C$ j( \, f z: e7 ]: s
query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`9 L8 d7 X! X4 h b# @
statement=`echo "INSERT INTO $TABLE VALUES($query);"`
* J2 `) o C: K. g5 F6 i; Yecho $statement
3 l+ D' { v! u( { l# e3 D. c- ]/ A8 F5 N
当然了,你也可以用其他办法,不过,几乎没有比awk更简单的了,第2种方法如下:5 g# d' b1 d9 ]7 ^
[url=]复制代码[/url]代码如下:' ~1 k, Z3 d; `6 {- |
1 j' k4 a ^% r, |" S, s8 `/ s
oldIFS=$IFS
! R: x. Y# h: b( ]+ m' i eIFS=,
5 H! z8 N4 V7 c3 Mvalues=($line)8 n* B6 G( P$ g. y( {' |
values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""- K, a1 G3 x( ~9 n) t$ r) u+ H
values[3]="\"`echo ${values[3]}`\"" query=`echo ${values[@]} | tr ' #' ', '`5 e A4 _# P* F
IFS=$oldIFS statement=`echo "INSERT INTO $TABLE VALUES($query);"`: L# V% r6 b8 u! A
echo "$statement"1 p3 W/ W# K3 S
. a. t! i: S# a0 e
( g/ B# f1 |5 s3 _( M! t
首先通过指定域分隔符,将csv文件解析成一个数组,然后将空格替换成一个特殊的符号"#"(因为后面的替换中,会一次性输出数组,而数组是用空格分隔各字段,我们要将分隔数组的空格替换成逗号,所以这里将数据中的空格替换成"#") ,给字符串加上双引号,最后再把空格替换成逗号,把"#"替换为空格。这种方法真是让人抓狂,我第一次就没有看明白,尤其是为什么要将空格替换成"#"。
# I; u' r; P7 W5 u完整的插入数据的程序如下:
: Q/ o1 ?% Z9 r. ? [url=]复制代码[/url]代码如下:
" R" d1 V" \* r9 b2 t) h
2 W% H# T- ~5 G0 w! m# A#!/bin/bash- N. v& j1 [' G4 x( b1 y9 _# G
#" e& h3 B" } K. C# x
# @file write_to_db_mysql.sh4 U0 M6 K- U- N# W
# @brief wirte data to database in mysql* r; a1 q1 Q C) c0 M# I6 [
# @author Mingxing LAI& i/ s% F q8 M6 X" S+ z
# @version 0.1
9 h# S& v" Q) d& u6 d5 @# @date 2013-01-20
1 e! @" P( y6 n2 j! Y+ D#
+ j( H4 \$ p" f# Q$ E' |USER="root"
7 y3 ?/ ^- i9 H1 Z% mDATABASE="students"
4 P, O5 G) M% [/ Q" T, Y9 _TABLE="students"+ @6 w' ]$ V. r* r3 |6 z" f/ Z
if [ $# -ne 1 ]; then, T* A. e) C' y8 F1 T3 H7 [& R
echo $0 DATAFILE V& G8 [+ _; G8 t* U/ C+ f% Z
echo; n! A$ m- H! v" B% ]" |
exit 2
; P) x1 H( P9 G* ?fi+ _; D8 A. r9 M; i* e! g
data=$1
* ^! B% Z- a* { v& m+ e8 |; Rwhile read line;$ j2 f, I' R- L
do+ X' g X# X5 Q) n" c$ j
# query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`
^; B, V6 Y/ t/ N oldIFS=$IFS
( B. L9 T' B9 q9 T/ l S) m2 L IFS=,
$ l0 Y }- ?- {; D values=($line)
0 Q6 O t- m6 M& C+ d) A values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""# |" K8 P6 C9 a- W0 O+ B9 `
values[3]="\"`echo ${values[3]}`\""
; W! }9 i% X( v query=`echo ${values[@]} | tr ' #' ', '`. N1 G0 G# C7 Z
IFS=$oldIFS
+ Y& N, h) x( |, v; J4 W statement=`echo "INSERT INTO $TABLE VALUES($query);"`/ \4 v1 _( T" ^! v" q
# echo $statement mysql -u $USER $DATABASE << EOF# K+ l" N0 P2 l" z* |4 M
INSERT INTO $TABLE VALUES($query);
9 `; J" L2 v9 ^3 y0 o' L# FEOF, w! C: o4 ~3 t5 O8 z
done < $data3 f8 B: e( P* L; D0 Z
if [[ $? -eq 0 ]]; then# B5 ^1 c! z8 Z; s. b! k( V" @& S
echo "Wrote data into DB"
. Y0 d; q2 T$ W: I7 sfi
0 w; a% z8 z% D, ?. J* x# B
8 ]; M7 y S6 T# b3 d
9 F; [2 C3 n0 O8 ?4. 读取数据 知道怎么在shell 中连接mysql ,也知道了怎么在shell中批量执行sql 语句,读取数据,就没有任何难度了。2 i2 N1 z! J0 l: {) k
[url=]复制代码[/url]代码如下:+ Y$ S' P, ?1 H1 u0 D
#!/bin/bash
: V( B) `/ I/ J, }" L2 P## m# ~- c9 x) Z# Y
# @file read_db_mysql.sh* v6 x+ e3 V- M) c2 y, A
# @brief read data from mysql8 o- i# {% C6 F1 n) j* a) b" f
# @author Mingxing LAI
7 L$ Q- o* C. [6 g# @version 0.1, a, b- s; o5 r, @! D% i# o7 P8 \. v5 P$ x5 E
# @date 2013-01-20
) S5 c' i4 l" q3 A#
! q0 B8 h) ^- [) h: P. A3 r% A4 c. pUSER="root"
( A! M5 W7 _$ r N" o) k1 w- FDATABASE="students"
# y' w& J3 Z7 r9 `6 @9 [TABLE="students" #用tail 去掉表头
d% g5 p: b2 B7 E. C. Wdepts=`mysql -u $USER $DATABASE <<EOF | tail -n +2
4 d# c2 V- f) p! C3 [SELECT DISTINCT dept FROM $TABLE;+ h0 O% V# {. h" w
EOF` for d in $depts; do
/ o: B; P7 S" T1 e echo Department: $d. V* |9 z7 y M
result="`mysql -u $USER $DATABASE << EOF% r, H, q G5 D/ @
set @i:=0;
/ T1 D7 q, F7 K! I% j6 s5 Z2 o SELECT @i:=@i+1 as rank, name, mark FROM students WHERE dept="$d" ORDER BY mark DESC;
, w. V1 q5 o# M! G; }/ F' BEOF`" echo "$result"
+ k; Z( f, M0 u: Iecho
, T' F% ~/ V/ R7 X/ Y* K7 g0 B4 `& F1 H. |done3 ?" p" p: a9 S f# D: z- _: ]
2 Q% }9 Q# N! e/ A, g# \9 m, }+ ?* @' X% N4 Y7 F) J
我们还可以在mysql语句中,使用选项来控制数据的输出格式
) ?; j+ n: x/ M& e$ l( B -H 输出为html8 P& R# u8 l9 ^+ v& b1 M2 a- n" N
-X 输出为xml 如下所示:. E# f; G9 ] I A+ t
[url=]复制代码[/url]代码如下:
. L6 A: r' e" O& Y: h: ^$ e0 |+ z/ h/ o1 B$ J' P) [7 C
#!/bin/bash# Q5 `$ F8 V. i1 z' ^
USER="root"% n: J$ a) P3 G
DATABASE="students"
( I8 k0 E* ]2 i0 l7 oTABLE="students"+ N: l9 o/ ~. x) ?; f) A, f
mysql -u $USER $DATABASE -H << EOF
+ x. I- F Z. k: {2 [9 F2 P4 m' x* Zselect * from $TABLE
% T: u7 W* m' PEOF: c4 v9 l; ]; W- L
/ N; C. j: l! W3 W( m f; Q7 a& v% y/ e
html 格式的可读性比较差,输出效果如下:
: y' B4 y! C" t S9 B[url=]复制代码[/url]代码如下:0 E5 \9 P6 V. `- a
<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>) U( H7 U0 `& X
^( y0 S# P, K+ |! ~
可读性差也可以理解,因为人家觉得,你没必要修改么,直接以html形式展示数据就可以了。
4 P' }5 i- ~: e% C( a- n; _[url=]复制代码[/url]代码如下: _4 I, k" @% X3 v2 e2 S" o) l
id name mark dept, s3 u2 |0 M" H( H+ [: x
1 Navin M 98 CS, T8 c; f" B- l9 B
2 Kavya N 70 CS
8 e2 s' x, l# c% ^3 Nawaz O 80 CS/ U' q% Q5 a3 p+ v8 y7 D
4 Hari S 80 EC
4 P$ {1 n5 Y1 ]4 s5 b! h& l* z5 Alex M 50 EC
' c' b+ I9 }- } Z$ ?1 O G* Y6 Neenu J 70 EC/ l0 ^3 a. a; n# y0 o( k i, L
7 Bob A 30 EC
% J/ }, D6 y( o w1 ^1 a8 Anu M 90 AE
5 e8 X& q0 `8 | L2 l' p9 Sruthi 89 AE* D) i1 U: z' `* \# ], c5 \$ y- R1 x
10 Andrew 89 AE+ k, W- U0 X. C) m, R
# {9 _% W3 K6 G" X( r
% V6 x: Y' ?2 ]0 D) |* O- h. Y& ~2 h
xml形式的数据显示就比较正常了,直接将上面的-H 换成-X,输出如下:; y$ G9 m& o) i7 l7 t
[url=]复制代码[/url]代码如下:
3 w, }4 y" e+ M% ^<?xml version="1.0"?>" X/ Y1 T4 y1 Y; m# V2 z- b
<resultset statement="select * from students" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
7 s* g( }" N7 } <row>
# |$ s2 _" i& A& f* g8 u <field name="id">1</field>: q9 ?6 V y* y3 `/ w
<field name="name">Navin M</field>
2 Y/ C7 A$ J: D5 x <field name="mark">98</field>6 i, ?+ g1 p9 e$ I% e1 |& x2 _
<field name="dept">CS</field>% v3 n: Q1 y( g! T
</row>
5 m( W/ P2 p1 C+ R7 }/ `" X2 p3 a- r <row>. B: w" E. u5 [( I
<field name="id">2</field>
5 y2 |6 j! T. @ <field name="name"> Kavya N</field>
0 z; W, l* e" G9 x; ?5 N <field name="mark">70</field>
+ ]- W8 B1 R; P0 O0 E <field name="dept">CS</field>
5 o6 Y c8 v5 F9 t9 z$ i1 _$ ]& P# i </row>0 l8 X& C! l" d: g8 Y, m% l* m
</resultset>
$ E- N; z/ A% |3 u! M. _% f" l: r" h, B0 ~' E) O4 q8 n/ O" l
. R* f+ K7 G# P4 B7 B
完。
9 [, r3 |( V6 K. H- Q1 U |