一般情况下不会特意到linux系统上去使用mysql, 毕竟没有类似MysqlFront这样现成的操作工具。但是产品的线上服务器是linux服务器,没办法,只能硬着头皮码shell语句来操作了。
首先要明确一点,拉sql的sql语句和在后台java内部调用sql语句的目标不同,所以设计方法也不同:拉sql注重开发sql语句效率,而运行效率不必过于在意,所以甚至可以一张表可以用几个sql语句来合成
通用语句如下:
mysql -u biadmin -h lbw-52xfj.mysql.rds.aliyuncs.com -p -e "你需要的sql语句" > 文件输出位置
-u 是mysql用户名, -h 是主机地址(如果是在本机上操作可以写 "localhost", 远程的话好像就只能写ip地址或者域名了), -e 不在mysql提示符环境下运行sql(当然你得每次输入密码!)
有几点是需要注意的:
1. " "内的sql语句不可以带"`",就是esc键与tab键之间的那个键,我试图把它加进去过,结果就是执行语句后程序一直suspend在那里, 如果sql语句字段里有特殊意义的字符比如 "sum",也只好换个命名方式了~~
2. sql语句中不可以存在回车键盘,否则系统会以回车键之前的语句作为 输入语句,这点非常坑爹,每次写好一个sql语句还要一行一行把它重新排列一次。目前没什么好的方法,我自己是用java把sql语句的 “\n\r” 替换成了空格~~,代码如下:
1 package utils;
2 import java.io.BufferedReader;
3 import java.io.BufferedWriter;
4 import java.io.File;
5 import java.io.FileReader;
6 import java.io.FileWriter;
7 import java.io.Reader;
8 import java.io.Writer;
9
10 public class SqlExport {
11
12 /**
13 * @Description 以" "拼接源文件各行并输出至目标文件
14 * @param srcAddr 源文件地址
15 * @param destAddr 目标文件地址
16 */
17 public void rmvEnter(String srcAddr, String destAddr) {
18 File srcFile = new File(srcAddr);
19 File destFile = new File(destAddr);
20
21 FileReader sr = null;
22 FileWriter dw = null;
23 BufferedReader br = null;
24 BufferedWriter bw = null;
25
26 try {
27 if (!srcFile.exists()) {
28 srcFile.createNewFile();
29 }
30 if (!destFile.exists()) {
31 destFile.createNewFile();
32 }
33 sr = new FileReader(srcFile);
34 dw = new FileWriter(destFile);
35 br = new BufferedReader(sr);
36 bw = new BufferedWriter(dw);
37
38 String str = null;
39 /* 读一行,写一行 */
40 while((str = br.readLine()) != null) {
41 str = " " + str;
42 bw.write(str);
43 }
44 bw.flush();
45 } catch (Exception e) {
46 e.printStackTrace();
47 } finally {
48 closeWriter(bw);
49 closeReader(br);
50 closeWriter(dw);
51 closeReader(sr);
52 }
53
54 }
55
56 private void closeReader(Reader rd) {
57 if (null != rd) {
58 try {
59 rd.close();
60 } catch(Exception e) {
61 e.printStackTrace();
62 }
63 }
64 }
65
66 private void closeWriter(Writer wr) {
67 if (null != wr) {
68 try {
69 wr.close();
70 } catch(Exception e) {
71 e.printStackTrace();
72 }
73 }
74 }
75
76
77 public static void main(String[] args) {
78 String srcAddr = "C:/Users/pc/Desktop/sql语句库/推荐人推广明细.sql";
79 String destAddr = "C:/Users/pc/Desktop/sql语句库/dest.sql";
80
81 new SqlExport().rmvEnter(srcAddr, destAddr);
82
83 }
84
85 }
View Code
3. 其中"文件输出位置"可以是不存在的文件,该语句会自动为你创建并注入查询结果,目前只试过CSV文件,xls格式文件还没有试过, 如果想把输出的CSV文件转为xls的话,先使用excel的自文本功能格式化CSV文件,之后将文件另存为excel格式。
4. " "内的sql语句要在最开始加上database选择语句, 否则执行shell命令后会报错: no database selected!