马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
本文介绍了如何在shell中读写mysql数据库。主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为xml或html文件, 并分析了核心语句。本文介绍的方法适用于PostgreSQL ,相对mysql而言,shell 中读写PostgreSQL会更简单些。 1. 连接mysql 数据库 shell中连接数据库的方法很简单,只需要指定用户名,密码,连接的数据库名称,然后通过重定向,输入mysql的语句,如下所示:$ ]4 X0 i. U2 J$ p' }3 q3 D/ [
[url=]复制代码[/url]代码如下:
% w& h( i& ~; n. l( C/ Emysql -u USERNAME -p PASSWORD DATABASENAME <<EOF 2>/dev/null1 Z0 d5 S1 N2 b# b! k6 S! I) a
show databases;
& E5 h0 z8 ^, @EOF! ~' _ d- h9 l7 h) P
6 x5 z9 F( {+ V: I J
但这并不是一个好办法,任何使用该脚本的用户都能看到该数据库用户的账号和密码,要解决这个问题,可以用mysql 数据库的一个特殊配置文件。mysql 数据库使用$HOME/.my.cnf 文件来读取特殊的启动命令和设置。其中一项设置是由该用户账户发起的mysql 会话的默认密码。要在这个文件中设置默认密码,可以加入下面的内容:
2 n9 F4 }+ ?, W6 t; g [url=]复制代码[/url]代码如下:
6 { I; A' p) O) {. z5 ]4 }: s! Y/ v2 X
[client]
# n8 W5 g5 S, Z% u" w" Npassword = 123456
+ c# ?2 a) t L! }7 y然后,别忘了修改权限:! |, J- `$ ? f% S2 j
chmod 400 .my.cnf
5 m- f; E/ v" r) Q' c ]这样就可以通过脚本访问mysql数据库了,如下所示:7 R) r8 {* I5 e6 F/ ^
#!/bin/bash
1 G* ?* o7 }6 U6 q* NMYSQL=`which mysql`6 y" n {; B4 Y9 {5 M- n
$MYSQL test -u root << EOF
! W9 I' B3 C/ i7 Y9 `: Cshow databases;3 k2 ]" Z+ t0 a; ]& L
show tables;
/ x2 v9 c& W( n- V0 _: cselect * from employees where salary > 4000;. |+ `+ [* ~" ^6 ^2 F
EOF$ E `( d0 W. y/ c) h2 {$ x
7 p- | f7 m- Q3 M1 L" a% a6 A7 B: e/ Q$ N8 C
2. 创建数据库 通过上面的方法连接数据库,再通过重定向输入mysql语句,shell中读写mysql基本就介绍完了。只要把sql语句写对了,通过重定向执行即可,下面来看一个实例:
) s" W/ z* [6 g [url=]复制代码[/url]代码如下:
, g9 j) l* p* T) f$ b2 h5 M1 ]/ t5 g3 D, _& s4 D* y* e+ ^0 r- u3 m6 g7 k0 c
#!/bin/bash/ B: U; p7 D3 i8 `! f& @
##############################
9 q+ r) X8 P% N8 d0 v7 @, C# @file create_db_mysql.sh
4 O# F9 `# Q7 F3 X1 g, {1 {, p; C# @brief create database and tables in mysql
! ]( ], |- L5 \& j' V4 v, t+ k# @author Mingxing LAI
4 E; s+ q8 m Y/ P2 ]# x' |# @version 0.1" Z3 n& ]0 I/ [% l: _4 e1 P6 k
# @date 2013-01-20
6 X8 ^2 H- ?& _0 U {5 o7 P9 X s. R( ~$ z##############################7 v2 s% y. k6 s* R( q' k" s' y4 u
USER="root"/ k8 ^ \3 h# Z# v: Z, b
DATABASE="students"
2 }) |' ]0 E1 c; KTABLE="students"# J$ C, |. g$ ]9 E
######################
* k/ m" D6 o* e2 H4 u2 O3 F#crate database
/ q! M4 m! T. R9 bmysql -u $USER << EOF 2>/dev/null
. K- _# |9 q& t4 w7 c# ^CREATE DATABASE $DATABASE
: k- P, l: t# XEOF
5 }$ Z- f/ S8 Z5 a[ $? -eq 0 ] && echo "created DB" || echo DB already exists& T( f- J0 [. t0 o2 o$ _
######################
1 ^* `; |2 y: C3 F. a; X; @#create table
0 U6 P/ B8 W% i4 Rmysql -u $USER $DATABASE << EOF 2>/dev/null& X" C$ c$ N0 y0 @5 R. P
CREATE TABLE $TABLE(
. y4 S- P) O' {/ gid int,
$ p! |5 ]' J9 [; p$ D0 Xname varchar(100),
9 x n: ]+ `- i1 |6 Omark int,( i1 c m$ P! S/ U# X: h
dept varchar(4)' l% d+ l% a( I
);5 ]4 I+ x2 x3 u6 k. b
EOF1 \6 P6 @2 Z9 s: f$ l
[ $? -eq 0 ] && echo "Created table students" || echo "Table students already exist"
' Q V8 f# J6 O0 n; a######################+ [1 j9 W3 @8 H9 O; F* C8 Y
#delete data& C" Y+ |% Z$ t0 u9 }
mysql -u $USER $DATABASE << EOF 2>/dev/null# L$ ?* X2 p+ [3 R( m: c R: l
DELETE FROM $TABLE;* P8 G4 R9 O6 k- L5 `/ _
EOF( S/ f5 y, m7 R; G6 P
`1 V% o0 O* a' Y; T4 L这个脚本比较简单,就是几条SQL语句,没什么好解释的,下面来看一下,如何读入csv 文件,然后插入到mysql数据库中。 3. 插入csv 文件 上面创建了一个学生表,表中有学生的学号,姓名,成绩,系别,假设有一个csv文件,内容如下:
R5 W2 X5 @& L5 s' N! d [url=]复制代码[/url]代码如下:
5 v* H5 D; L; S* W3 k$cat data3 }/ u' P, d! q! x9 l2 ^5 x' b
1,Navin M,98,CS e- S/ m. [/ R7 h2 A/ }
2,Kavya N,70,CS( W. Q" ?4 j0 n
3,Nawaz O,80,CS1 o- `& w- k- Y
4,Hari S,80,EC0 F. r N$ i( x
5,Alex M,50,EC# l% h# Q5 _* y
6,Neenu J,70,EC# c: H3 E3 B$ n+ j+ c# p
7,Bob A,30,EC$ P& Q' F: \) f: I
8,Anu M,90,AE
$ B/ S( k- j- u2 ]9,Sruthi,89,AE0 K( B( Q; z: v3 ?; S: m% T$ p
10,Andrew,89,AE
( P, I( J& ]$ W! R% U2 x( q B3 y3 C7 L/ p5 L- Q; @
- ?5 h4 D' Y0 l
为了将csv 文件插入到数据库,我们需要逐行读入,然后给字符串加上双引号,最后生成语句如下:
: j G4 y0 D9 `9 _[url=]复制代码[/url]代码如下:- C8 h4 @, t1 F' v- S2 ^5 x6 _
2 D9 p9 S- t9 U" Z0 a+ [; m, L+ r' H
insert into students VALUES(1, "Navin M", 98, "CS");
0 Y( e: p+ X" x( o) u& ]; }" |. o g
+ I( k" h% C( `* c! a* d2 x3 Q; [) ^4 V/ p' Y. [
要解析csv 文件,最好的工具莫过于awk了,将域的分隔符指定为逗号-F,,awk就自动将各个域拆分出来了,然后在需要双引号的地方打印输出一个双引号,就能够轻松得到下面这样的数据:
. ^7 I9 h, A6 J. ?& l1 t- W5 R# R[url=]复制代码[/url]代码如下:
8 B- \% f; T# ^2 l+ y, D1, "Navin M", 98, "CS" awk 代码如下:$ L1 ]' K* n7 d/ j
query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`* D) V9 Q/ F) {3 Q
statement=`echo "INSERT INTO $TABLE VALUES($query);"`' W* E- k" ]# i
echo $statement
/ n2 D0 r: G1 ]9 |; K Y/ e/ [( o' R& h8 C/ n
当然了,你也可以用其他办法,不过,几乎没有比awk更简单的了,第2种方法如下: w3 p! E8 S4 k. m3 n7 w" H) W
[url=]复制代码[/url]代码如下:8 K; D6 s/ n. e/ X- s
' ?1 } H# I0 {: d/ x- d6 yoldIFS=$IFS: `$ U% e# L8 _& w( L5 j q# |' h
IFS=,3 p; F s; U6 E" A
values=($line)
% d2 S( D+ ~* H# T) x s4 uvalues[1]="\"`echo ${values[1]} | tr ' ' '#' `\""
0 d5 L. F H/ U1 }' Uvalues[3]="\"`echo ${values[3]}`\"" query=`echo ${values[@]} | tr ' #' ', '`
* t s7 R% [" v: vIFS=$oldIFS statement=`echo "INSERT INTO $TABLE VALUES($query);"`; y" ~% b" a. E: [' M
echo "$statement"
' m* m: e/ P" Q& s3 F " z# Y, o6 |( v" I: E: v
8 X$ V6 f7 d3 t- Z6 R1 L
首先通过指定域分隔符,将csv文件解析成一个数组,然后将空格替换成一个特殊的符号"#"(因为后面的替换中,会一次性输出数组,而数组是用空格分隔各字段,我们要将分隔数组的空格替换成逗号,所以这里将数据中的空格替换成"#") ,给字符串加上双引号,最后再把空格替换成逗号,把"#"替换为空格。这种方法真是让人抓狂,我第一次就没有看明白,尤其是为什么要将空格替换成"#"。
/ q$ c, M5 A* F1 ^ J5 K$ s完整的插入数据的程序如下:
( p1 e: `; ?+ }! R d [url=]复制代码[/url]代码如下:/ k+ F5 Z9 a( N- W
7 q: K) b( H! A8 V6 f; c
#!/bin/bash
' F' ~9 M. Y! W1 q' J#
$ s# u4 S; @& c$ [# @file write_to_db_mysql.sh2 W- c6 }4 e z, U$ D
# @brief wirte data to database in mysql& e3 P( S$ f1 A: }/ a) c) ^" Z
# @author Mingxing LAI/ D" T# Y. @$ g. U& n: [
# @version 0.14 E+ x- Q0 c* ~0 Q' @
# @date 2013-01-20
6 w6 ?% r% [6 Q" S#7 b2 @- M: ]: u0 x: m
USER="root") m1 J$ i+ L5 r; b7 r
DATABASE="students"
( _) i; h0 J1 U$ I) _TABLE="students"
; C' [& N; m# T" V; O$ V3 dif [ $# -ne 1 ]; then. m1 t4 Z6 B, T, z$ c
echo $0 DATAFILE
7 a7 {) C% b0 O* n) [" _' X3 m0 H echo
- [5 E" }0 j% ~6 E# u exit 2
" H) [" s1 v1 h2 _8 V3 ]fi
( m l) O1 T8 o# xdata=$1+ a0 X+ P- x) o6 l: U; q
while read line;* g% `9 U& E4 p* x1 ]
do
9 n9 Z/ d [' j; l2 e: V7 X* y4 t# query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`. }/ T! a9 P: \2 {6 }" g
oldIFS=$IFS
C, I3 M; J; X! A: g, S1 V2 f IFS=,. P! _) m' `1 p3 ^3 c& Q2 x% `
values=($line)
! @3 ~9 D8 ~0 x values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""" ^6 j. o: P# O" E9 V6 W: s" {1 L
values[3]="\"`echo ${values[3]}`\""
8 E0 x9 R1 [& v3 ~4 l' T query=`echo ${values[@]} | tr ' #' ', '`
2 k8 q8 w( x+ y IFS=$oldIFS3 i3 K% M/ _: @3 U
statement=`echo "INSERT INTO $TABLE VALUES($query);"`
& `6 b0 v; n8 U& _. g& q1 \# echo $statement mysql -u $USER $DATABASE << EOF' r% \5 {* x7 B; }7 ^
INSERT INTO $TABLE VALUES($query);" J5 T+ v8 i+ Q6 p0 S
EOF3 b+ q4 z8 R+ e2 Z- @. B
done < $data& S' _. s. |. ~9 N0 Z0 J
if [[ $? -eq 0 ]]; then
6 R7 Q7 f; _0 b echo "Wrote data into DB"
( r# Y5 m# S3 O- M1 P |fi3 X$ Y; N1 K, Y6 F' _! c
- x6 [! d# b/ ?, Q3 v0 z
. \6 o: `6 I( {4 f7 g4. 读取数据 知道怎么在shell 中连接mysql ,也知道了怎么在shell中批量执行sql 语句,读取数据,就没有任何难度了。2 N J b5 S% r
[url=]复制代码[/url]代码如下:; Q* H* F3 X: f6 i
#!/bin/bash
- F$ ~5 r0 g0 W8 B7 z#
. ~, i) D0 F" \* Q# @file read_db_mysql.sh# u, d0 ]4 Z# C3 @7 K6 X8 h
# @brief read data from mysql
* z! @- }; x5 x Z E( h K2 i& V" b# @author Mingxing LAI/ e X9 y. B/ Q1 H2 S
# @version 0.12 x; p+ a' i6 W- [- p) y; k
# @date 2013-01-20
( V: \/ _3 q) K- k( }- E#4 x9 D" M$ m: `8 P! t4 g
USER="root"
5 a4 Z j- w1 H( YDATABASE="students"/ v& z7 l0 r& F
TABLE="students" #用tail 去掉表头
* d' h. D9 k' Y3 V9 gdepts=`mysql -u $USER $DATABASE <<EOF | tail -n +2
0 ^+ A6 X( V. J% X GSELECT DISTINCT dept FROM $TABLE;" X% l$ b$ r5 ^& K2 S) U+ W6 V
EOF` for d in $depts; do. Q. S {2 I7 W3 y* i: U
echo Department: $d8 a k# d& W8 s; ^: f/ O8 t
result="`mysql -u $USER $DATABASE << EOF) v' c. Q+ [* m2 A: v
set @i:=0;4 ]' J( ]' z2 Z
SELECT @i:=@i+1 as rank, name, mark FROM students WHERE dept="$d" ORDER BY mark DESC;5 G) M5 h5 t4 O
EOF`" echo "$result"- S) P6 g% Q" h
echo : H% r9 O- r. M$ _3 v& @
done
$ o+ D P& S) V, C# [) {
$ s. q# l O6 K# y6 x2 m8 ^+ S7 E( c
我们还可以在mysql语句中,使用选项来控制数据的输出格式
; `* w6 O$ s; Z& ~' I& J% ^/ O -H 输出为html% ~' z( {" Y8 Q4 \& G
-X 输出为xml 如下所示:
/ S8 X2 x! X" y/ N @ [url=]复制代码[/url]代码如下:+ U" f3 e5 `# w1 P3 i
; C- x, T4 H8 E; H#!/bin/bash: ?$ W, {+ s/ \! @
USER="root"
5 [! L* X9 i" DDATABASE="students"% v; ^& i% Z1 q# H+ i+ p6 j
TABLE="students"; ?: |* V: s& _% ], t, [7 [" l; N
mysql -u $USER $DATABASE -H << EOF
* ], e" z: [4 q- }7 ?: E# x, Mselect * from $TABLE% `4 k$ Y! q- v
EOF* F6 L. _, q& k' I! F" N
3 S! [! } H/ M: I O/ J/ d/ X% p2 g& ^8 G! M3 ^! G
html 格式的可读性比较差,输出效果如下:
# q/ X) |/ i. C4 }[url=]复制代码[/url]代码如下:# n* {8 h" w7 V- x7 P
<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> R" D; G( D) V
- V1 a" ?3 ?. f- l# `1 B0 T3 P/ g) j
可读性差也可以理解,因为人家觉得,你没必要修改么,直接以html形式展示数据就可以了。
8 @+ B# Q6 n1 }( S' w, l6 b[url=]复制代码[/url]代码如下:% @. P) X1 r3 q& H7 ?; O
id name mark dept
. M9 L& |& i- D& ]5 M7 k' N Q1 Navin M 98 CS
' c9 ]% |9 F9 `1 X; c% W2 Kavya N 70 CS9 @' c5 O3 z4 p* E) n7 {
3 Nawaz O 80 CS
2 m3 I x6 l. Z4 Hari S 80 EC
1 p" p# N8 B. W1 t5 Alex M 50 EC. G) }# t+ G3 z# p1 K
6 Neenu J 70 EC
7 w* ]1 p! |8 k5 ~% k/ A( ^. ~2 c$ O7 Bob A 30 EC6 X5 d$ K3 Z1 J
8 Anu M 90 AE/ o# I9 h7 O s: w9 T$ T
9 Sruthi 89 AE
- v& k7 W O2 X3 u5 e; _' X8 Y. N10 Andrew 89 AE; E! z' X/ c9 c% w
7 m; x }" Y8 o+ {* z$ T# x1 q: a3 O# E! v J" y4 \6 h
xml形式的数据显示就比较正常了,直接将上面的-H 换成-X,输出如下:
$ T' E6 m" i. }[url=]复制代码[/url]代码如下:
3 M: k0 |" M9 u6 u$ {<?xml version="1.0"?>
$ p0 V( F& P# c- k) G$ n<resultset statement="select * from students" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">5 u. d7 a! q8 ]; y/ q
<row>1 y8 ~) d5 {) I1 e+ t# ^4 q
<field name="id">1</field>7 L% U+ f6 c1 F: j" }% I# _3 w
<field name="name">Navin M</field>: I I$ B2 t8 j' b/ u0 Y
<field name="mark">98</field>
# P' }6 g- y% R6 d3 K0 b! X <field name="dept">CS</field>) j0 A2 [2 S+ @. Y6 k" f
</row>! w* c/ z; B8 {+ s# J3 F! {
<row>' j6 T/ Q7 U& I4 {" ?) m6 G& d
<field name="id">2</field>
% P" |7 V; F+ [9 ]$ J) q. t <field name="name"> Kavya N</field>5 T) T; U" O- q0 G6 Y- N4 ?; v) T
<field name="mark">70</field>
- e9 b0 O$ m1 ?! w0 }# X <field name="dept">CS</field>! d) O/ ?6 I- s9 ~/ m
</row>
% l3 w. E7 P! l# q: w4 |4 T</resultset>
) L# t' s5 G; G$ W; O' G4 M2 z7 N8 Y4 Q4 }, J8 P+ S
- r3 d/ x6 x2 Y0 b! n
完。
/ q9 i9 c3 b& b0 p' n' ?0 `6 g |