有没有一种简单的方式可以从Linux命令行运行MySQL查询并以CSV格式输出结果?
这是我现在正在做的:
mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/ /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ
当需要将许多列用引号括起来或结果中有需要转义的引号时,情况会变得混乱。
用法:
mysql your_database -p < my_requests.sql | awk '{print $1","$2}' > out.csv
mysql -uUser -pPassword your_database < my_requests.sql | awk 'BEGIN{OFS="=";} {print $1,$2}' > out.csv
- Josh从命令行,您可以执行以下操作:
mysql -h *hostname* -P *port number* --database=*database_name* -u *username* -p -e *your SQL query* | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > *output_file_name.csv*
--csv
标志导出CSV格式数据: mycli db_name --csv -e "select * from flowers" > flowers.csv
brew update && brew install mycli
。我再也不会使用原生的mysql客户端了,mycli太棒了! - bithavoc这个答案使用了Python和一款流行的第三方库PyMySQL ,我添加了它是因为Python的csv库足够强大,可以正确处理许多不同类型的.csv
文件,而其他答案都没有使用Python代码与数据库进行交互。
import contextlib
import csv
import datetime
import os
# https://github.com/PyMySQL/PyMySQL
import pymysql
SQL_QUERY = """
SELECT * FROM my_table WHERE my_attribute = 'my_attribute';
"""
# embedding passwords in code gets nasty when you use version control
# the environment is not much better, but this is an example
# https://dev59.com/RGcs5IYBdhLWcg3w8obK
SQL_USER = os.environ['SQL_USER']
SQL_PASS = os.environ['SQL_PASS']
connection = pymysql.connect(host='localhost',
user=SQL_USER,
password=SQL_PASS,
db='dbname')
with contextlib.closing(connection):
with connection.cursor() as cursor:
cursor.execute(SQL_QUERY)
# Hope you have enough memory :)
results = cursor.fetchall()
output_file = 'my_query-{}.csv'.format(datetime.datetime.today().strftime('%Y-%m-%d'))
with open(output_file, 'w', newline='') as csvfile:
# https://dev59.com/rnA75IYBdhLWcg3wo6le#17725590 about lineterminator
csv_writer = csv.writer(csvfile, lineterminator='\n')
csv_writer.writerows(results)
tr
命令将默认制表符替换为任意分隔符。$ echo "SELECT * FROM Table123" | mysql Database456 | tr "\t" ,
这很简单,并且适用于任何不需要批处理模式或输出文件的内容:
select concat_ws(',',
concat('"', replace(field1, '"', '""'), '"'),
concat('"', replace(field2, '"', '""'), '"'),
concat('"', replace(field3, '"', '""'), '"'))
from your_table where etc;
解释:
""
替换 "
--> replace(field1, '"', '""')
concat('"', result1, '"')
concat_ws(',', quoted1, quoted2, ...)
就是这样!
concat_ws()
函数将跳过 NULL
值,导致列不匹配。为了避免这种情况,可以使用空字符串代替:IFNULL(field, '')
(或者使用其他代表 NULL
的值)。 - Marco Roy您可以创建一个使用CSV引擎的MySQL数据表。
然后,您将拥有一个始终以CSV格式存在于硬盘上的文件,可以直接复制而无需进行处理。
为了进一步解释之前的答案,下面这个一行代码可以将单个表格导出为一个以Tab分隔的文件。它适用于自动化,例如每天导出数据库。
mysql -B -D mydatabase -e 'select * from mytable'
方便地,我们可以使用相同的技术来列出MySQL的表格,并描述单个表格上的字段:
mysql -B -D mydatabase -e 'show tables'
mysql -B -D mydatabase -e 'desc users'
Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
email varchar(128) NO UNI NULL
lastName varchar(100) YES NULL
title varchar(128) YES UNI NULL
userName varchar(128) YES UNI NULL
firstName varchar(100) YES NULL
mysql -B -D mydatabase -e 'select * from mytable' | sed -e 's/\t/,/g'
- DSimonsed -e 's/\t/,/g'
是安全的。该命令的作用是将制表符替换为逗号。 - awattssed -e 's/"/\\"/g' -e 's/\t/","/g' -e 's/^/"/' -e 's/$/"/'
- Flimm在用户7610的基础上,这是最好的方法。 使用mysql outfile
会遇到60分钟的文件所有权和覆盖问题。
虽然不够酷,但只需5分钟即可完成。
php csvdump.php localhost root password database tablename > whatever-you-like.csv
<?php
$server = $argv[1];
$user = $argv[2];
$password = $argv[3];
$db = $argv[4];
$table = $argv[5];
mysql_connect($server, $user, $password) or die(mysql_error());
mysql_select_db($db) or die(mysql_error());
// fetch the data
$rows = mysql_query('SELECT * FROM ' . $table);
$rows || die(mysql_error());
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
// output the column headings
$fields = [];
for($i = 0; $i < mysql_num_fields($rows); $i++) {
$field_info = mysql_fetch_field($rows, $i);
$fields[] = $field_info->name;
}
fputcsv($output, $fields);
// loop over the rows, outputting them
while ($row = mysql_fetch_assoc($rows)) fputcsv($output, $row);
?>
这是我的工作内容:
echo $QUERY | \
mysql -B $MYSQL_OPTS | \
perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^[\d.]+$/ ? $_ : qq("$_")} @F ' | \
mail -s 'report' person@address
perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^\d+(?:\.\d+)?$/ ? $_ : qq("$_")} @F '
-- 你的代码没有引用 1.2.3
。 - artfulrobot
REPLACE()
函数来转义引号。 - dsm