shell脚本连接、读写、操作mysql数据库实例_sh脚步怎么读取mysql-程序员宅基地

技术标签: postgresql  mysql  数据库  

本文介绍了如何在shell中读写mysql数据库。主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为xml或html文件, 并分析了核心语句。本文介绍的方法适用于PostgreSQL ,相对mysql而言,shell 中读写PostgreSQL会更简单些。

1. 连接mysql 数据库

shell中连接数据库的方法很简单,只需要指定用户名,密码,连接的数据库名称,然后通过重定向,输入mysql的语句,如下所示:

代码如下: mysql -u USERNAME -p PASSWORD DATABASENAME <<EOF 2>/dev/null
    show databases;
EOF

但这并不是一个好办法,任何使用该脚本的用户都能看到该数据库用户的账号和密码,要解决这个问题,可以用mysql 数据库的一个特殊配置文件。mysql 数据库使用$HOME/.my.cnf 文件来读取特殊的启动命令和设置。其中一项设置是由该用户账户发起的mysql 会话的默认密码。要在这个文件中设置默认密码,可以加入下面的内容:

代码如下:
[client]
password = 123456
然后,别忘了修改权限:
chmod 400  .my.cnf
这样就可以通过脚本访问mysql数据库了,如下所示:
#!/bin/bash
MYSQL=`which mysql`
$MYSQL test -u root << EOF
show databases;
show tables;
select * from employees where salary > 4000;
EOF

2. 创建数据库

通过上面的方法连接数据库,再通过重定向输入mysql语句,shell中读写mysql基本就介绍完了。只要把sql语句写对了,通过重定向执行即可,下面来看一个实例:

代码如下:
#!/bin/bash
##############################
# @file create_db_mysql.sh
# @brief create database and tables in mysql
# @author Mingxing LAI
# @version 0.1
# @date 2013-01-20
##############################
USER="root"
DATABASE="students"
TABLE="students"
######################
#crate database
mysql -u $USER << EOF 2>/dev/null
CREATE DATABASE $DATABASE
EOF
[ $? -eq 0 ] && echo "created DB" || echo DB already exists
######################
#create table
mysql -u $USER $DATABASE << EOF 2>/dev/null
CREATE TABLE $TABLE(
id int,
name varchar(100),
mark int,
dept varchar(4)
);
EOF
[ $? -eq 0 ] && echo "Created table students" || echo "Table students already exist"
######################
#delete data
mysql -u $USER $DATABASE << EOF 2>/dev/null
DELETE FROM $TABLE;
EOF

这个脚本比较简单,就是几条SQL语句,没什么好解释的,下面来看一下,如何读入csv 文件,然后插入到mysql数据库中。

3. 插入csv 文件

上面创建了一个学生表,表中有学生的学号,姓名,成绩,系别,假设有一个csv文件,内容如下:

代码如下: $cat data
1,Navin M,98,CS
2,Kavya N,70,CS
3,Nawaz O,80,CS
4,Hari S,80,EC
5,Alex M,50,EC
6,Neenu J,70,EC
7,Bob A,30,EC
8,Anu M,90,AE
9,Sruthi,89,AE
10,Andrew,89,AE


为了将csv 文件插入到数据库,我们需要逐行读入,然后给字符串加上双引号,最后生成语句如下:

代码如下:
insert into students VALUES(1, "Navin M", 98, "CS");


要解析csv 文件,最好的工具莫过于awk了,将域的分隔符指定为逗号-F,,awk就自动将各个域拆分出来了,然后在需要双引号的地方打印输出一个双引号,就能够轻松得到下面这样的数据:

代码如下: 1, "Navin M", 98, "CS" awk 代码如下:
query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`
statement=`echo "INSERT INTO $TABLE VALUES($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 "INSERT INTO $TABLE VALUES($query);"`
echo "$statement"


首先通过指定域分隔符,将csv文件解析成一个数组,然后将空格替换成一个特殊的符号"#"(因为后面的替换中,会一次性输出数组,而数组是用空格分隔各字段,我们要将分隔数组的空格替换成逗号,所以这里将数据中的空格替换成"#") ,给字符串加上双引号,最后再把空格替换成逗号,把"#"替换为空格。这种方法真是让人抓狂,我第一次就没有看明白,尤其是为什么要将空格替换成"#"。

完整的插入数据的程序如下:

复制代码 代码如下:
#!/bin/bash
#
# @file write_to_db_mysql.sh
# @brief wirte data to database in mysql
# @author Mingxing LAI
# @version 0.1
# @date 2013-01-20
#

USER="root"
DATABASE="students"
TABLE="students"
if [ $# -ne 1 ]; then
    echo $0 DATAFILE
    echo
    exit 2
fi
data=$1
while  read line;
do
#   query=`echo $line | awk -F, '{ printf("%s,\"%s\",%s,\"%s\"", $1, $2, $3, $4)}'`
    oldIFS=$IFS
    IFS=,
    values=($line)
    values[1]="\"`echo ${values[1]} | tr ' ' '#' `\""
    values[3]="\"`echo ${values[3]}`\""
    query=`echo ${values[@]} | tr ' #' ', '`
    IFS=$oldIFS
    statement=`echo "INSERT INTO $TABLE VALUES($query);"`
#   echo $statement

mysql -u $USER $DATABASE << EOF
    INSERT INTO $TABLE VALUES($query);
EOF
done < $data
if [[ $? -eq 0 ]]; then
    echo "Wrote data into DB"
fi

4. 读取数据

知道怎么在shell 中连接mysql ,也知道了怎么在shell中批量执行sql 语句,读取数据,就没有任何难度了。

代码如下: #!/bin/bash
#
# @file read_db_mysql.sh
# @brief read data from mysql
# @author Mingxing LAI
# @version 0.1
# @date 2013-01-20
#

USER="root"
DATABASE="students"
TABLE="students"

#用tail 去掉表头
depts=`mysql -u $USER $DATABASE <<EOF | tail -n +2
SELECT DISTINCT dept FROM $TABLE;
EOF`

for d in $depts; do
    echo Department: $d
    result="`mysql -u $USER $DATABASE << EOF
    set @i:=0;
    SELECT @i:=@i+1 as rank, name, mark FROM students WHERE dept="$d" ORDER BY mark DESC;
EOF`"

echo "$result"
echo
done


我们还可以在mysql语句中,使用选项来控制数据的输出格式

    -H 输出为html
    -X 输出为xml

如下所示:

代码如下:
#!/bin/bash
USER="root"
DATABASE="students"
TABLE="students"

mysql -u $USER $DATABASE -H << EOF
select * from $TABLE
EOF


可读性差也可以理解,因为人家觉得,你没必要修改么,直接以html形式展示数据就可以了。

代码如下: id    name    mark    dept
1    Navin M    98    CS
2    Kavya N    70    CS
3    Nawaz O    80    CS
4    Hari S    80    EC
5    Alex M    50    EC
6    Neenu J    70    EC
7    Bob A    30    EC
8    Anu M    90    AE
9    Sruthi    89    AE
10    Andrew    89    AE


xml形式的数据显示就比较正常了,直接将上面的-H 换成-X,输出如下:

代码如下: <?xml version="1.0"?>
< resultset statement="select * from students" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <row>
    <field name="id">1</field>
    <field name="name">Navin M</field>
    <field name="mark">98</field>
    <field name="dept">CS</field>
  </row>
  <row>
    <field name="id">2</field>
    <field name="name"> Kavya N</field>
    <field name="mark">70</field>
    <field name="dept">CS</field>
  </row>
< /resultset>


完。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_72431373/article/details/126682079

智能推荐

2-4 Sass的函数功能-颜色函数_css rgba $color-程序员宅基地

文章浏览阅读1.8w次。RGB颜色函数-RGB()颜色函数在 Sass 的官方文档中,列出了 Sass 的颜色函数清单,从大的方面主要分为 RGB , HSL 和 Opacity 三大函数,当然其还包括一些其他的颜色函数,比如说 adjust-color 和 change-color 等。在这章节中,将主要和大家一起探讨 Sass 颜色函数中常见的 RGB、HSL 和 Opacity 函数。1、RGB颜色函数R_css rgba $color

2021年Flutter中使用barcode_scan_fix实现二维码扫描_barcodescanner.scan-程序员宅基地

文章浏览阅读1k次。dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter date_format: ^1.0.6 flutter_cupertino_date_picker: ^1.0.26+2 flutter_swiper: ^1.1.6 fluttertoast: ^7.1.6 http: ^0.12.2 dio: ^3.0.10 flutter_html: ^1.1.0 fl..._barcodescanner.scan

【Java】对字符串追加的五种操作的比较_java往最左边追加字符串-程序员宅基地

文章浏览阅读2.2w次,点赞7次,收藏10次。文章转自:https://www.cnblogs.com/twzheng/p/5923642.html常用的字符串拼接的方法:1. 直接使用“+”;2. String contact() 方法;3. StringUtils.join() 方法;4. StringBuffer append() 方法;5. StringBuilder append() 方法;经过简单的程序..._java往最左边追加字符串

Mac OSX 下的mysql数据库文件存放位置-程序员宅基地

文章浏览阅读9k次。之前我的mysql的系统数据库里的表被我玩坏了,万般无奈之下只得删除所有mysql的东西重新构建数据库。按照网上搜到的内容删除后重装发现数据库没有什么变化。于是自己在每个可能存放数据库文件的目录查找,最终确认目录位置如下:使用HomeBrew安装为/usr/local/var/mysql使用官方下载的dmg镜像安装为/usr/local/mysql删除这个目录再重新安装mysql就..._macbook mysql数据存放

Nginx http_auth_request_module 统一用户验证权限验证-程序员宅基地

文章浏览阅读6.5k次,点赞3次,收藏5次。auth_request|access|auth_basic比较无论是通过access模块限制IP还是通过auth_basic模块限制用户名密码,这些都是非常简单的用户验证方式。在生产环境当中很可能会有动态web服务器,它们通过更加复杂的用户名密码权限验证。这个时候可以通过访问nginx资源时候,先将用户的去请求传递给这样的应用服务器,根据应用服务器返回的结果再判断请求资源能不能继续执行。..._http_auth_request_module

js基础(六){数组 数组的方法 使用 length属性 对象的使用}_数组内逗号分隔字符串 怎么使用length属性-程序员宅基地

文章浏览阅读1.2k次。数组装载一组数据的容器数组的定义方式1 字面量语法: var arr = [];方式2 构造函数语法: var arr = new Array();传参规则: 当没有参数时, 定义的是一个空数组 当参数只有一个并且是数字时,该数字表示数组的长度 当参数有多个时,参数就是每一个成员方式3 构造函数语法: var arr = Ar..._数组内逗号分隔字符串 怎么使用length属性

随便推点

view的绘制_view 绘制 unspecified-程序员宅基地

文章浏览阅读294次。文章总结了view绘制流程中调用的方法,以及如何正确的获取view是宽高等。_view 绘制 unspecified

如何让html的div内容溢出后显示滚动条_html 如何实现仅在溢出时滚动-程序员宅基地

文章浏览阅读2.2w次,点赞5次,收藏8次。很多小伙伴会在写页面时有这样一个困扰,当div固定高度时导致里面的内容溢出,而影响了整体美观。_html 如何实现仅在溢出时滚动

操作系统-锁机制_系统锁-程序员宅基地

文章浏览阅读1.3w次,点赞13次,收藏42次。计算机操作系统锁机制.在多线程编程中,操作系统引入了锁机制。通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。所谓的锁,可以理解为内存中的一个整型数,拥有两种状态:空闲状态和上锁状态。加锁时,判断锁是否空闲,如果空闲,修改为上锁状态,返回成功;如果已经上锁,则返回失败。解锁时,则把锁状态修改为空闲状态。 加锁过程用如下伪码表示_系统锁

Zend studio 配置SVN报错:SSL Handshake failed: ‘java.security.cert.CertificateException..._java.security.cert.certificateexception certificat-程序员宅基地

文章浏览阅读274次。SSL Handshake failed: ‘java.security.cert.CertificateException: Certificates does not conform to algorithm constraint……这时可按下方方法解决;方案一:把/jre/lib/security/java.security 文件里的jdk.certpath.disabledAlgor..._java.security.cert.certificateexception certificates does not conform to

最新的DDR5标准简介以及规范协议验证介绍_ddr5协议-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏83次。内存(DRAM)作为当代数字系统最主要的核心部件之一,从各种终端设备到核心层数据处理和存储设备,从各种消费类电子设备到社会各行业专用设备,是各种级别的CPU进行数据处理运算和缓存的不可或缺的周转“仓库”,一个强大的核心处理单元也必须配备一个高速运转的宽通路的数据访问和存储单元。近20多年来,DRAM也快速地从20世纪末期的SDRAM发展到21世纪DDRRAM。在21世纪的前10年,DDR标准主要是..._ddr5协议

百度地图异步加载时出现的问题_异步百度地图webgl获取不到-程序员宅基地

文章浏览阅读1.8k次。在使用百度地图做项目的时候,因为加载js在没有网络的时候,是非常缓慢的,时间约有20s了,在这期间,页面一片空白,造成了不好的用户体验,所以这里想到用异步加载,但是在查看文档使用代码之后,页面一直不调用回调函数init();最后自己手动调用,以下是代码 domReady(function(){ window.areaArr=[]; require(['ztree.excheck'],f..._异步百度地图webgl获取不到

推荐文章

热门文章

相关标签