马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
本文介绍了如何在shell中读写mysql数据库。主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为xml或html文件, 并分析了核心语句。本文介绍的方法适用于PostgreSQL ,相对mysql而言,shell 中读写PostgreSQL会更简单些。 1. 连接mysql 数据库 shell中连接数据库的方法很简单,只需要指定用户名,密码,连接的数据库名称,然后通过重定向,输入mysql的语句,如下所示:, O. M W' {( j5 G8 F( s
[url=]复制代码[/url]代码如下:
7 V' M+ X) y) B7 ^: N2 tmysql -u USERNAME -p PASSWORD DATABASENAME <<EOF 2>/dev/null
6 y( O: x, \" W% @0 t show databases;5 C& K9 |) f9 q. i
EOF
7 Y3 R' q& s3 r% N
8 w) l3 T9 t3 }# @但这并不是一个好办法,任何使用该脚本的用户都能看到该数据库用户的账号和密码,要解决这个问题,可以用mysql 数据库的一个特殊配置文件。mysql 数据库使用$HOME/.my.cnf 文件来读取特殊的启动命令和设置。其中一项设置是由该用户账户发起的mysql 会话的默认密码。要在这个文件中设置默认密码,可以加入下面的内容:
" `% q( i+ }/ Q+ r% s [url=]复制代码[/url]代码如下:) p6 E7 T# U+ p" i* W: p. [2 d, _
# t+ L, a- G/ l' u9 W; u[client]
7 f: m, k$ s; {; ^password = 123456, {! u) j \7 j G) C- w
然后,别忘了修改权限:& l4 V. I- W% [, G3 ?
chmod 400 .my.cnf v p# F* U( w
这样就可以通过脚本访问mysql数据库了,如下所示:
0 _; x- p2 ?$ }; B8 s#!/bin/bash6 f2 W" S& q& S+ I
MYSQL=`which mysql`. V' ^* `+ f: o; c3 C
$MYSQL test -u root << EOF
6 B) d6 A# k7 Q# y! H/ j; V l0 nshow databases;6 ~3 c7 S# o9 D1 e
show tables;
! C3 o0 e) e; n; G' Cselect * from employees where salary > 4000;' r ^- h* {4 I
EOF! |- }. t/ O. @4 t$ f( z) W4 R
4 N# H( J) ]) J8 [+ G- p' m/ U+ U0 X% \% L7 N. X6 l
2. 创建数据库 通过上面的方法连接数据库,再通过重定向输入mysql语句,shell中读写mysql基本就介绍完了。只要把sql语句写对了,通过重定向执行即可,下面来看一个实例:
) o% B, b5 o; T. {/ I: J5 B6 g" G. U [url=]复制代码[/url]代码如下:3 P* _) C. L, G0 q
" p) M' U- X; q( g2 E6 ]
#!/bin/bash
" \$ ?$ f4 E7 z) a- e% w# k##############################
4 p& C: \% E* l8 m& j& O" C5 _# @file create_db_mysql.sh% z7 [/ ]& i" `- J* n# h* T
# @brief create database and tables in mysql, i8 ?. X) D. m
# @author Mingxing LAI
3 I" I' Z' U+ [# J# @version 0.16 I8 p! A) z+ u( m( c) n
# @date 2013-01-20
3 l, b6 H0 Q5 T7 t1 I##############################
' _# T) w+ W: \4 G* _+ [2 IUSER="root": y, A, S4 a# Y1 c
DATABASE="students"; m0 Y) \; P/ [# q
TABLE="students", r% {( l2 d a9 d2 @; a& B
######################
$ Z8 W7 K: X' x. c+ F! D#crate database
9 V( Y$ ]( L+ H; Q z) T1 ^) p( mmysql -u $USER << EOF 2>/dev/null; ]0 r& x8 K3 P0 q9 V
CREATE DATABASE $DATABASE. X+ ~+ x H, u( F& l+ G2 n) P
EOF
# S# ^3 Q' o" V1 _& h9 V[ $? -eq 0 ] && echo "created DB" || echo DB already exists
$ \' `) Q7 j( I######################
5 r! J( L% s7 |#create table
9 Q% x$ A7 D5 T* Imysql -u $USER $DATABASE << EOF 2>/dev/null
5 S% k7 ~9 ~+ yCREATE TABLE $TABLE(2 ]4 X2 G" {2 v( N
id int,
' _; S2 T. Z$ p' Yname varchar(100),
' \- K3 L$ Y+ R. P8 ]8 [9 Z/ ^mark int,
# [4 i2 P) W4 m, z! rdept varchar(4)9 ^" B# q$ n' F1 J
);
. ^/ N5 ]: C* ?% F* C; TEOF0 D- K' `6 i: p% U7 K" Y1 h
[ $? -eq 0 ] && echo "Created table students" || echo "Table students already exist"
. _2 t# r1 c' |& g# a) Q######################
& E: e0 Z+ V6 r) c8 U' ?" F6 ~8 ?#delete data
/ A1 W; N8 C1 Y* W* c6 w: cmysql -u $USER $DATABASE << EOF 2>/dev/null
: P1 z$ _6 O( B: g+ s; |DELETE FROM $TABLE;
7 t7 G' C1 D9 W, KEOF
8 C: ~1 {3 i u' Y1 N" C4 b9 c/ D7 H% m" ^ W4 U( [
这个脚本比较简单,就是几条SQL语句,没什么好解释的,下面来看一下,如何读入csv 文件,然后插入到mysql数据库中。 3. 插入csv 文件 上面创建了一个学生表,表中有学生的学号,姓名,成绩,系别,假设有一个csv文件,内容如下:
5 @$ L. M" A7 ~8 P& A2 D4 G% H [url=]复制代码[/url]代码如下:4 J1 B7 ^: u, Y) k
$cat data
/ w+ G. d" r+ h" P1,Navin M,98,CS
1 M6 j+ Q" Q2 Z+ e2,Kavya N,70,CS9 m2 a2 \" }% q
3,Nawaz O,80,CS" D" Y% E: D( C7 F0 z# Z& ?
4,Hari S,80,EC
4 u* b' ~/ }7 H8 ?: T% M5,Alex M,50,EC+ X0 w( ]- @& [9 o1 m
6,Neenu J,70,EC( V, o0 m# O; m' E" w
7,Bob A,30,EC; g5 ]+ {, N- i1 S
8,Anu M,90,AE% O4 j, H( y. `; r
9,Sruthi,89,AE3 Z& Y9 x( _+ g7 H8 x, S: ^
10,Andrew,89,AE
( e# w: `. {* t- y4 c
X5 J9 E6 b- Y8 e" j( V/ w2 J3 a* K9 ?$ P* `3 U: y' M9 Z8 n* H
为了将csv 文件插入到数据库,我们需要逐行读入,然后给字符串加上双引号,最后生成语句如下:* L$ P$ m8 b( j8 b( U
[url=]复制代码[/url]代码如下:2 y4 \; m1 Y x8 r9 V; P2 L
; ` V* i* B' Q3 ]/ K3 R \; }
insert into students VALUES(1, "Navin M", 98, "CS");- Q& |5 s% N3 l! E
9 n$ s' `4 z+ A! U7 d1 Q
% w$ H; B' k5 I5 l/ i. b3 N
要解析csv 文件,最好的工具莫过于awk了,将域的分隔符指定为逗号-F,,awk就自动将各个域拆分出来了,然后在需要双引号的地方打印输出一个双引号,就能够轻松得到下面这样的数据:
! W/ W. S \2 L& q[url=]复制代码[/url]代码如下:
- U& l$ B: w# c. o9 V' f1, "Navin M", 98, "CS" awk 代码如下:2 ?; Q; _. ~/ ?" s* s
query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`
, r) A0 C+ O+ I4 |6 F' s6 _statement=`echo "INSERT INTO $TABLE VALUES($query);"`
7 L* I7 }$ s: c3 t2 Secho $statement- F; ]/ t" C u* `4 i5 U1 ^# H
3 R4 ?) _' T) ] i% y; R& {当然了,你也可以用其他办法,不过,几乎没有比awk更简单的了,第2种方法如下:" B, D0 r. K$ G
[url=]复制代码[/url]代码如下:
* N, C$ b |0 U) g+ }- t/ i' E6 o0 L2 o( m. s: W
oldIFS=$IFS
% c8 m5 K6 q Z- d" ~IFS=,
- I- |# F1 i: I! I9 f% p. Q+ kvalues=($line)7 T) z( b" H7 `5 c4 R( v
values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""
. Y# o0 z/ A m4 K+ Nvalues[3]="\"`echo ${values[3]}`\"" query=`echo ${values[@]} | tr ' #' ', '`
5 f3 J- m% C( b: `8 j% j6 }4 r9 ^( rIFS=$oldIFS statement=`echo "INSERT INTO $TABLE VALUES($query);"`; v- B( Y. ?5 A$ i/ a4 L3 @: ^" P
echo "$statement"% E$ F7 U9 Y. O& s8 r. U* {8 N
( }" I( V9 C5 Q
( ^9 j r# X t$ q) ~; g$ \首先通过指定域分隔符,将csv文件解析成一个数组,然后将空格替换成一个特殊的符号"#"(因为后面的替换中,会一次性输出数组,而数组是用空格分隔各字段,我们要将分隔数组的空格替换成逗号,所以这里将数据中的空格替换成"#") ,给字符串加上双引号,最后再把空格替换成逗号,把"#"替换为空格。这种方法真是让人抓狂,我第一次就没有看明白,尤其是为什么要将空格替换成"#"。4 b+ p! a) T; W3 K" M3 e# o6 ~
完整的插入数据的程序如下:: j) W) _/ A; n) x" G1 T, t
[url=]复制代码[/url]代码如下:
8 S/ o' h' W4 X- B$ ~( }
- l/ f# l) u0 F( d#!/bin/bash4 v. S: ^. V" Q- B1 h3 r
#1 y! e/ U a. u& L
# @file write_to_db_mysql.sh: x6 r0 T: f; c( ^" `- T3 ^
# @brief wirte data to database in mysql
, R: @6 n! o4 P1 L# @author Mingxing LAI* d! m* p% B6 H4 h
# @version 0.1
8 Q- \4 c! s: N; [6 ]) G# @date 2013-01-20$ b2 Z6 t: s9 f* z/ O
#8 p. I% S0 ]/ w3 {5 q
USER="root"
r% i# Q% _6 a' {DATABASE="students"0 x6 b! m. w: [4 v
TABLE="students"
: G. x; R: r. @" k* I4 yif [ $# -ne 1 ]; then/ Z. e; O9 u& V- {3 G: Q8 O
echo $0 DATAFILE: q: B6 c& G$ N9 K [, p4 T
echo) D4 f0 v( K- Y/ ^% {, Y/ L3 r
exit 2
6 V7 `/ V! I. E9 N( Z/ n8 jfi6 ]' T; g2 T* _
data=$1
1 C/ G( p. d; X$ qwhile read line;3 ?. j5 Z) H: z& Z
do
$ r; e5 V v5 t5 _+ O5 A, [# query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`
8 m) ?! L7 q9 M7 _/ L9 j oldIFS=$IFS
4 b# q3 J8 @: k6 k1 } IFS=,
8 g8 o: W0 t5 v) N# e values=($line)' G8 a* ~; }3 Y6 }. ^
values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""8 Q1 g' {9 `* F) n2 X
values[3]="\"`echo ${values[3]}`\""$ _) [1 B* r' a2 J6 W3 B5 n
query=`echo ${values[@]} | tr ' #' ', '`
" L& v4 H6 s1 E* j6 r0 F IFS=$oldIFS
$ i. H3 D( D, y% o S4 w7 Z+ d, L statement=`echo "INSERT INTO $TABLE VALUES($query);"`
6 z# b' a, i. I- ~3 N* Z# echo $statement mysql -u $USER $DATABASE << EOF
2 j [. k+ j2 {6 h INSERT INTO $TABLE VALUES($query);
, n! _$ q1 b6 r# NEOF
; f7 Y! P% A7 l' m" R2 Ydone < $data9 [/ _& `- I( S% {8 Y4 ?( v
if [[ $? -eq 0 ]]; then
' n, m3 D; }" D/ n9 O# E echo "Wrote data into DB"
/ K, N" g. Q# M# d) Kfi" x0 K: S* m+ t9 f+ z
; |- n- E& a( Q' ?* o
1 l" o- s3 F6 F5 p3 g) N. W
4. 读取数据 知道怎么在shell 中连接mysql ,也知道了怎么在shell中批量执行sql 语句,读取数据,就没有任何难度了。
1 K" b. I J1 ] [url=]复制代码[/url]代码如下:
' @7 c6 |2 t& U+ a3 V4 ~#!/bin/bash- Q0 M* x% r6 g% t5 N
#
7 ^/ V7 J1 L+ m6 x9 D# @file read_db_mysql.sh# d5 }5 N$ ?1 l
# @brief read data from mysql" N; w3 Q0 x5 x
# @author Mingxing LAI
- A# z* J- X, b7 T# @version 0.1$ R/ y& P; o" T: I: l
# @date 2013-01-20" d1 J% ]8 h+ J j0 r
#/ f+ d3 I8 V, f' G8 b
USER="root"- r* i) l: k# j$ v& Y* ^8 y8 r U& X
DATABASE="students"2 r6 J# Q: j! }+ u
TABLE="students" #用tail 去掉表头! M* a& X- m+ j s3 v
depts=`mysql -u $USER $DATABASE <<EOF | tail -n +29 f* @. c5 y. M! x4 j; |
SELECT DISTINCT dept FROM $TABLE;
, V Z1 c. i* L8 G9 T3 wEOF` for d in $depts; do
! L6 S* F# B# ^5 _" H+ T! ]7 ^ echo Department: $d. d0 A% w6 Q+ m- B% {5 ]8 |+ `5 h
result="`mysql -u $USER $DATABASE << EOF
9 E* H; T1 Q* P/ ?7 U1 z! [1 e, b set @i:=0;$ e0 g. `5 R' R( i
SELECT @i:=@i+1 as rank, name, mark FROM students WHERE dept="$d" ORDER BY mark DESC;
( V2 J& O+ U1 a6 \ W2 q* }0 NEOF`" echo "$result"
; f- w! d+ _ X; J5 [; K' n. Becho / l% c6 \# v, h! T. S F$ ~
done& y0 G0 k1 \& l5 L% F; A! d" H- \
' `! J. a! i- ]4 f+ R/ ~/ F7 Z# o! N" J8 P
我们还可以在mysql语句中,使用选项来控制数据的输出格式
3 _( ?( _+ W$ U& B0 c2 u! [9 \ -H 输出为html
# E4 s9 @3 v( ]3 I$ r! D -X 输出为xml 如下所示:
% ]4 y1 V& z' @6 A# r- D [url=]复制代码[/url]代码如下:
7 r; x8 D5 W9 T5 N8 W) Q+ ^5 K0 i$ [" L; W) l1 j. |! _
#!/bin/bash* B- r5 ~" i. r8 h6 e1 U6 i
USER="root"( S2 B& L- ^* n, W* x6 m
DATABASE="students"
; V8 L: I! O+ S% x7 B1 tTABLE="students"& U7 Z! G, M2 b, c3 W
mysql -u $USER $DATABASE -H << EOF u9 e( P3 n: G3 Q
select * from $TABLE
3 j2 q) Y' n" QEOF" I" G" `1 c" L3 R+ E$ Z
3 y& v" q7 D# B2 W0 I. w5 S
! u% C5 a3 v' V( E+ g: H0 T0 s& ~html 格式的可读性比较差,输出效果如下:
% s7 y. e2 \. B; T D. }, e5 i. x[url=]复制代码[/url]代码如下:3 i- ?' c7 |0 T0 t Y
<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>
' ^- ~# b) ]) D, [2 a; |/ L! t, c) w6 W6 ] @ I9 ?# u7 c7 ~
可读性差也可以理解,因为人家觉得,你没必要修改么,直接以html形式展示数据就可以了。
$ M8 q% H; v: _, h G+ ]' N r[url=]复制代码[/url]代码如下:
# K0 S; i! |8 h; J tid name mark dept7 y: K/ s* q& i
1 Navin M 98 CS6 h# _$ G+ K, d4 H! @9 O! _" A
2 Kavya N 70 CS$ C; U( H% z* ?9 X( H4 J
3 Nawaz O 80 CS
$ H4 S8 H s Q8 m9 P4 Hari S 80 EC0 i% S; W8 A8 Z8 J C
5 Alex M 50 EC" K4 C2 V! P5 x" i9 {* B
6 Neenu J 70 EC0 z9 r+ Q- b' Y4 o6 U* y8 y0 V
7 Bob A 30 EC
! U1 D9 c. P3 ?) C: G8 Anu M 90 AE" L4 `+ D- I4 l8 `
9 Sruthi 89 AE
( L9 N) z5 O. v% F7 a9 g6 V+ m10 Andrew 89 AE
! f6 h a! h; D) `% Q" E
: S+ N e9 s m7 ?
+ C2 T/ l4 Z% W% s# Bxml形式的数据显示就比较正常了,直接将上面的-H 换成-X,输出如下:
# E; J! D+ x0 n' Z( h) i[url=]复制代码[/url]代码如下:
/ b, g6 R& \9 K( c( i& A<?xml version="1.0"?>
/ j N* G {6 s; Q) \' G<resultset statement="select * from students" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">0 L2 ~2 S1 k i7 l- f6 f+ b
<row>
6 H8 W/ W1 S" V+ H <field name="id">1</field>
7 p @% Q( n7 L3 C% o+ i; }- t <field name="name">Navin M</field>0 x" t% k! t2 X' w0 z0 o
<field name="mark">98</field>% G0 V) {% {, y( ~5 O6 V
<field name="dept">CS</field>
7 v' G5 m- \; E& m( i </row>
S% |" s2 f, q) P( J <row>" g! z% k3 F" X* F1 A
<field name="id">2</field>
8 [. y$ ]; E: F8 m% l) E <field name="name"> Kavya N</field>' K: ^; `% n( g+ e+ M* M+ b
<field name="mark">70</field>
5 i' l" C/ J2 x' ^+ |( Q <field name="dept">CS</field>9 g! R& G* d* F8 E4 G
</row>
. T' @3 O [, c$ A6 C</resultset>% J3 _. h; V6 }* H
/ H6 u0 g, v& l/ p" J
3 L z$ @$ e0 c完。
$ L! u3 p& O) t3 p5 S. g |