질문자 :MCS
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 쿼리 결과를 텍스트 또는 CSV 파일로 저장에서 :
SELECT order_id,product_name,qty FROM orders WHERE foo = 'bar' INTO OUTFILE '/var/lib/mysql-files/orders.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
참고: 해당 구문은 다음과 같이 재정렬해야 할 수 있습니다.
SELECT order_id,product_name,qty INTO OUTFILE '/var/lib/mysql-files/orders.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM orders WHERE foo = 'bar';
최신 버전의 MySQL에서.
이 명령을 사용하면 열 이름이 내보내지지 않습니다.
또한 /var/lib/mysql-files/orders.csv
는 MySQL을 실행 하는 서버에 있습니다. MySQL 프로세스가 실행 중인 사용자는 선택한 디렉토리에 쓸 수 있는 권한이 있어야 합니다. 그렇지 않으면 명령이 실패합니다.
원격 서버(특히 Heroku 또는 Amazon RDS 와 같은 호스팅 또는 가상화 시스템)에서 로컬 시스템에 출력을 쓰려는 경우 이 솔루션은 적합하지 않습니다.
Paul Tomblinmysql your_database --password=foo < my_requests.sql > out.csv
탭으로 구분됩니다. 진정한 CSV를 얻으려면 그렇게 파이프하십시오 ( 사용자 John Carter 덕분에).
... .sql | sed 's/\t/,/g' > out.csv
Stanmysql --배치, -B
탭을 열 구분 기호로 사용하여 결과를 인쇄하고 각 행은 새 행에 표시됩니다. 이 옵션을 사용하면 mysql은 히스토리 파일을 사용하지 않습니다. 배치 모드에서는 표 형식이 아닌 출력 형식과 특수 문자 이스케이프가 발생합니다. 원시 모드를 사용하여 이스케이프를 비활성화할 수 있습니다. --raw 옵션에 대한 설명을 참조하십시오.
이렇게 하면 탭으로 구분된 파일이 제공됩니다. 쉼표(또는 쉼표를 포함하는 문자열)는 이스케이프되지 않으므로 구분 기호를 쉼표로 변경하는 것은 간단하지 않습니다.
serbaut다음은 상당히 까다로운 방법입니다. [1]
mysql --user=wibble --password wobble -B -e "select * from vehicle_categories;" | sed "s/'/'/;s/\t/","/g;s/^/"/;s/$/"/;s/\n//g" > vehicle_categories.csv
그것은 꽤 잘 작동합니다. 그러나 다시 한 번 정규식은 쓰기 전용임을 증명합니다.
정규식 설명:
- s///는 첫 번째 사이에 있는 것을 // 두 번째 사이에 있는 것으로 대체하는 것을 의미합니다.
- 끝에 "g"는 "첫 번째뿐만 아니라 모든 인스턴스"를 의미하는 수정자입니다.
- ^(이 문맥에서)는 줄의 시작을 의미합니다.
- $(이 컨텍스트에서)는 줄 끝을 의미합니다.
따라서 모든 것을 종합하면 다음과 같습니다.
s/'/\'/ Replace ' with \' s/\t/\",\"/g Replace all \t (tab) with "," s/^/\"/ at the beginning of the line place a " s/$/\"/ At the end of the line, place a " s/\n//g Replace all \n (newline) with nothing
[1] 나는 그것을 어딘가에서 찾았고 어떤 크레딧도 받을 수 없다.
Tim Harding'tr'을 통해 파이프하십시오(Unix/ Cygwin 만 해당):
mysql <database> -e "<query here>" | tr '\t' ',' > data.csv
주의: 이것은 포함된 쉼표나 포함된 탭을 처리하지 않습니다.
strickli이것은 나를 두 번 구했습니다. 빠르고 작동합니다!
--batch 탭 을 열 구분자로 사용하여 결과를 인쇄하고, 각 행은 새 행에 표시됩니다.
--raw는 문자 이스케이프를 비활성화합니다(\n, \t, \0 및 \).
예시:
mysql -udemo_user -p -h127.0.0.1 --port=3306 \ --default-character-set=utf8mb4 --database=demo_database \ --batch --raw < /tmp/demo_sql_query.sql > /tmp/demo_csv_export.tsv
완전성을 위해 CSV로 변환 할 수 있습니다(그러나 탭이 필드 값(예: 텍스트 필드) 안에 있을 수 있으므로 주의하십시오).
tr '\t' ',' < file.tsv > file.csv
hrvoj3ePaul Tomblin 이 제공한 OUTFILE 솔루션은 파일이 MySQL 서버 자체에 기록되도록 하므로 FILE 액세스 권한과 로그인 액세스 권한 또는 해당 상자에서 파일을 검색할 수 있는 다른 수단이 있는 경우에만 작동합니다.
그러한 액세스 권한이 없고 탭으로 구분된 출력이 CSV에 대한 합리적인 대안인 경우(예: 최종 목표가 Excel로 가져오는 것인 경우) serbaut의 솔루션 ( mysql --batch
및 선택적으로 --raw
)은 다음과 같습니다. 가는 길.
Leland WoodburyMySQL Workbench 는 레코드세트를 CSV로 내보낼 수 있으며 필드의 쉼표를 매우 잘 처리하는 것 같습니다. CSV는 OpenOffice Calc에서 잘 열립니다.
David Oliver사용하다:
mysql your_database -p < my_requests.sql | awk '{print $1","$2}' > out.csv
SteveMySQL Workbench를 제외한 현재까지의 모든 솔루션은 올바르지 않으며 MySQL 데이터베이스의 일부 가능한 콘텐츠에 대해 매우 안전하지 않을 수 있습니다(즉, 보안 문제).
MySQL Workbench(및 유사하게 phpMyAdmin )는 공식적으로 올바른 솔루션을 제공하지만 출력을 사용자 위치로 다운로드하도록 설계되었습니다. 데이터 내보내기 자동화와 같은 작업에는 그다지 유용하지 않습니다.
mysql -B -e 'SELECT ...'
출력에서 정확하고 정확한 CSV 콘텐츠를 생성하는 것은 불가능합니다. 왜냐하면 필드의 캐리지 리턴과 공백을 인코딩할 수 없기 때문입니다. mysql
대한 '-s' 플래그는 백슬래시 이스케이프를 수행하고 올바른 솔루션으로 이어질 수 있습니다. 그러나 스크립팅 언어(Bash가 아닌 적절한 내부 데이터 구조를 가진 언어)와 인코딩 문제가 이미 신중하게 해결된 라이브러리를 사용하는 것이 훨씬 더 안전합니다.
대본을 쓸까 생각도 하고 있었는데, 뭐라고 불러야 하나 하는 생각이 들자마자 동명의 기존 작품을 검색하게 되었어요. 자세히 다루지는 않았지만 mysql2csv 는 유망해 보입니다. 애플리케이션에 따라 SQL 명령을 지정하는 YAML 접근 방식이 매력적일 수도 있고 그렇지 않을 수도 있습니다. 또한 Ubuntu 12.04 (Precise Pangolin) 랩톱 또는 Debian 6.0 (Squeeze) 서버에 표준으로 제공되는 것보다 최신 버전의 Ruby가 필요하다는 요구 사항에 감격하지 않습니다. 예, 저는 RVM을 사용할 수 있다는 것을 알고 있지만, 그런 단순한 목적을 위해 RVM을 유지하고 싶지 않습니다.
mc0e이 페이지의 많은 답변은 CSV 형식에서 발생할 수 있는 일반적인 경우를 처리하지 않기 때문에 취약합니다. 예를 들어, 필드에 포함된 쉼표와 따옴표 및 결국에는 항상 나타나는 기타 조건이 있습니다. 모든 유효한 CSV 입력 데이터에 대해 작동하는 일반 솔루션이 필요합니다.
다음은 Python의 간단하고 강력한 솔루션입니다.
#!/usr/bin/env python import csv import sys tab_in = csv.reader(sys.stdin, dialect=csv.excel_tab) comma_out = csv.writer(sys.stdout, dialect=csv.excel) for row in tab_in: comma_out.writerow(row)
파일 이름을 tab2csv
지정하고 경로에 넣고 실행 권한을 부여한 다음 다음과 같이 사용합니다.
mysql OTHER_OPTIONS --batch --execute='select * from whatever;' | tab2csv > outfile.csv
Python CSV 처리 함수는 CSV 입력 형식에 대한 코너 케이스를 다룹니다.
스트리밍 방식을 통해 매우 큰 파일을 처리하도록 개선할 수 있습니다.
Chris Johnson명령줄에서 다음을 수행할 수 있습니다.
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*
크레딧: Amazon RDS에서 CSV 파일로 테이블 내보내기
Sri Murthy Upadhyayula이 답변은 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://stackoverflow.com/questions/12461484 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: # http://stackoverflow.com/a/17725590/2958070 about lineterminator csv_writer = csv.writer(csvfile, lineterminator='\n') csv_writer.writerows(results)
Ben이것은 간단하며 배치 모드나 출력 파일 없이도 작동합니다.
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, ...)
그게 다야!
Marty Hirsch또한 Bash 명령줄에서 쿼리를 수행하는 경우 tr
명령을 사용하여 기본 탭을 임의의 구분 기호로 대체할 수 있다고 생각합니다.
$ echo "SELECT * FROM Table123" | mysql Database456 | tr "\t" ,
user2427354나는 같은 문제가 발생했고 Paul's Answer 는 Amazon RDS 였기 때문에 옵션이 아니었습니다. 데이터에 쉼표와 탭이 포함되어 있으므로 탭을 쉼표로 교체하면 작동하지 않습니다. mysql-client에 대한 드롭인 대안인 mycli --csv
플래그를 사용하여 즉시 CSV 출력을 지원한다는 것을 발견했습니다.
mycli db_name --csv -e "select * from flowers" > flowers.csv
Shenal SilvaCSV 엔진을 사용하는 MySQL 테이블을 가질 수 있습니다.
그런 다음 처리하지 않고 복사할 수 있는 CSV 형식의 파일을 하드 디스크에 갖게 됩니다.
Jonathan이전 답변을 확장하기 위해 다음 한 줄짜리는 단일 테이블을 탭으로 구분된 파일로 내보냅니다. 매일 데이터베이스를 내보내는 자동화에 적합합니다.
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
johntellsall내가 하는 일은 다음과 같습니다.
echo $QUERY | \ mysql -B $MYSQL_OPTS | \ perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^[\d.]+$/ ? $_ : qq("$_")} @F ' | \ mail -s 'report' person@address
Perl 스크립트(다른 곳에서 발췌)는 탭 간격 필드를 CSV로 변환하는 훌륭한 작업을 수행합니다.
extraplanetaryuser7610을 기반으로 하는 가장 좋은 방법은 다음과 같습니다. 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); ?>
Michael Cole정확히 CSV 형식은 아니지만 MySQL 클라이언트 tee
명령 을 사용하여 출력을 로컬 파일에 저장할 수 있습니다.
tee foobar.txt SELECT foo FROM bar;
notee
사용하여 비활성화할 수 있습니다.
SELECT … INTO OUTFILE …;
의 문제; 서버에서 파일을 쓸 수 있는 권한이 필요하다는 것입니다.
Denilson Sá Maia나를 위해 일한 것 :
SELECT * FROM students WHERE foo = 'bar' LIMIT 0,1200000 INTO OUTFILE './students-1200000.csv' FIELDS TERMINATED BY ',' ESCAPED BY '"' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
이 스레드의 솔루션 중 내 특정 경우에는 효과가 없었습니다. CSV 출력에서 엉망이 될 열 중 하나에 예쁜 JSON 데이터가 있었습니다. 비슷한 문제가 있는 경우 \r\n으로 끝나는 줄을 대신 시도하십시오.
또한 Microsoft Excel로 CSV를 열려고 하는 사람들을 위한 또 다른 문제는 단일 셀이 보유할 수 있는 32,767자의 제한이 있으며 그 이상은 아래 행으로 오버플로된다는 점입니다. 열에서 문제가 있는 레코드를 식별하려면 아래 쿼리를 사용하세요. 그런 다음 해당 레코드를 자르거나 원하는 대로 처리할 수 있습니다.
SELECT id,name,CHAR_LENGTH(json_student_description) AS 'character length' FROM students WHERE CHAR_LENGTH(json_student_description)>32767;
Rohit ChemburkarTim Harding이 게시한 솔루션을 사용하여 프로세스를 용이하게 하기 위해 이 Bash 스크립트를 만들었습니다(루트 암호가 요청되지만 다른 사용자를 요청하도록 스크립트를 쉽게 수정할 수 있습니다).
#!/bin/bash if [ "$1" == "" ];then echo "Usage: $0 DATABASE TABLE [MYSQL EXTRA COMMANDS]" exit fi DBNAME=$1 TABLE=$2 FNAME=$1.$2.csv MCOMM=$3 echo "MySQL password: " stty -echo read PASS stty echo mysql -uroot -p$PASS $MCOMM $DBNAME -B -e "SELECT * FROM $TABLE;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > $FNAME
database.table.csv라는 파일이 생성 됩니다.
lepe서버에 PHP가 설정되어 있으면 mysql2csv 를 사용하여 임의의 MySQL 쿼리에 대해 (실제로 유효한) CSV 파일을 내보낼 수 있습니다. MySQL-SELECT * INTO OUTFILE LOCAL에서 내 대답을 참조하십시오. 좀 더 많은 컨텍스트/정보를 위해.
--file
및 --query
옵션을 제공하기에 충분하도록 mysql
에서 옵션 이름을 유지하려고 했습니다.
./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"
"설치"를 통해 mysql2csv
wget https://gist.githubusercontent.com/paslandau/37bf787eab1b84fc7ae679d1823cf401/raw/29a48bb0a43f6750858e1ddec054d3552f3cbc45/mysql2csv -O mysql2csv -q && (sha256sum mysql2csv | cmp <(echo "b109535b29733bd596ecc8608e008732e617e97906f119c66dd7cf6ab2865a65 mysql2csv") || (echo "ERROR comparing hash, Found:" ;sha256sum mysql2csv) ) && chmod +x mysql2csv
(요점의 내용을 다운받아 체크섬을 체크하고 실행 가능하게 한다.)
Hirnhamster다음은 탭으로 구분된 유효한 CSV 출력을 생성합니다. 대부분의 다른 답변과 달리 이 기술은 sed , AWK 또는 tr 과 같은 스트림 필터 없이 탭, 쉼표, 따옴표 및 새 줄의 이스케이프를 올바르게 처리합니다.
예제는 스트림을 사용하여 원격 MySQL 테이블을 로컬 SQLite 데이터베이스로 직접 파이프하는 방법을 보여줍니다. 이것은 FILE 권한이나 SELECT INTO OUTFILE 권한 없이 작동합니다. 가독성을 위해 새 줄을 추가했습니다.
mysql -B -C --raw -u 'username' --password='password' --host='hostname' 'databasename' -e 'SELECT CONCAT('\''"'\'',REPLACE(`id`,'\''"'\'', '\''""'\''),'\''"'\'') AS '\''id'\'', CONCAT('\''"'\'',REPLACE(`value`,'\''"'\'', '\''""'\''),'\''"'\'') AS '\''value'\'' FROM sampledata' 2>/dev/null | sqlite3 -csv -separator $'\t' mydb.db '.import /dev/stdin mycsvtable'
명령줄에서 암호에 대한 경고를 표시하지 않으려면 2>/dev/null
데이터에 NULL이 있는 경우 쿼리에서 IFNULL() 함수를 사용할 수 있습니다.
humbads내 경우에는 INTO OUTFILE .....
전에 from table_name .....
오류가 발생합니다.
절의 예기치 않은 순서. (위치 10의 "FROM" 근처)
나를 위해 일하는 것:
SELECT * INTO OUTFILE '/Volumes/Development/sql/sql/enabled_contacts.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM table_name WHERE column_name = 'value'
Md. Robi Ullahsecure-file-priv
오류가 발생하는 경우 대상 파일 위치를 C:\ProgramData\MySQL\MySQL Server 8.0\Uploads
한 후 쿼리를 실행한 후에도 -
SELECT * FROM attendance INTO OUTFILE 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\FileName.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
작동하지 않으면 \
(backsplash)를 /
(forwardsplash)로 변경해야 합니다.
그리고 그것은 작동합니다!!
예시:
SELECT * FROM 출석 INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/FileName.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
성공적인 쿼리를 실행할 때마다 매번 새로운 CSV 파일이 생성됩니다! 멋지죠?
AAYUSH SHAHTim Harding의 답변 에서 영감을 받아 CSV 덤프에 대한 간단한 쿼리를 수행하기 위한 Tiny Bash 스크립트 .
#!/bin/bash # $1 = query to execute # $2 = outfile # $3 = mysql database name # $4 = mysql username if [ -z "$1" ]; then echo "Query not given" exit 1 fi if [ -z "$2" ]; then echo "Outfile not given" exit 1 fi MYSQL_DB="" MYSQL_USER="root" if [ ! -z "$3" ]; then MYSQL_DB=$3 fi if [ ! -z "$4" ]; then MYSQL_USER=$4 fi if [ -z "$MYSQL_DB" ]; then echo "Database name not given" exit 1 fi if [ -z "$MYSQL_USER" ]; then echo "Database user not given" exit 1 fi mysql -u $MYSQL_USER -p -D $MYSQL_DB -B -s -e "$1" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > $2 echo "Written to $2"
minitauros다음 Bash 스크립트가 저에게 효과적입니다. 선택적으로 요청된 테이블에 대한 스키마도 가져옵니다.
#!/bin/bash # # Export MySQL data to CSV #https://stackoverflow.com/questions/356578/how-to-output-mysql-query-results-in-csv-format # # ANSI colors #http://www.csc.uvic.ca/~sae/seng265/fall04/tips/s265s047-tips/bash-using-colors.html blue='\033[0;34m' red='\033[0;31m' green='\033[0;32m' # '\e[1;32m' is too bright for white bg. endColor='\033[0m' # # A colored message # params: # 1: l_color - the color of the message # 2: l_msg - the message to display # color_msg() { local l_color="$1" local l_msg="$2" echo -e "${l_color}$l_msg${endColor}" } # # Error # # Show the given error message on standard error and exit # # Parameters: # 1: l_msg - the error message to display # error() { local l_msg="$1" # Use ANSI red for error color_msg $red "Error:" 1>&2 color_msg $red "\t$l_msg" 1>&2 usage } # # Display usage # usage() { echo "usage: $0 [-h|--help]" 1>&2 echo " -o | --output csvdirectory" 1>&2 echo " -d | --database database" 1>&2 echo " -t | --tables tables" 1>&2 echo " -p | --password password" 1>&2 echo " -u | --user user" 1>&2 echo " -hs | --host host" 1>&2 echo " -gs | --get-schema" 1>&2 echo "" 1>&2 echo " output: output CSV directory to export MySQL data into" 1>&2 echo "" 1>&2 echo " user: MySQL user" 1>&2 echo " password: MySQL password" 1>&2 echo "" 1>&2 echo " database: target database" 1>&2 echo " tables: tables to export" 1>&2 echo " host: host of target database" 1>&2 echo "" 1>&2 echo " -h|--help: show help" 1>&2 exit 1 } # # show help # help() { echo "$0 Help" 1>&2 echo "===========" 1>&2 echo "$0 exports a CSV file from a MySQL database optionally limiting to a list of tables" 1>&2 echo " example: $0 --database=cms --user=scott --password=tiger --tables=person --output person.csv" 1>&2 echo "" 1>&2 usage } domysql() { mysql --host $host -u$user --password=$password $database } getcolumns() { local l_table="$1" echo "describe $l_table" | domysql | cut -f1 | grep -v "Field" | grep -v "Warning" | paste -sd "," - 2>/dev/null } host="localhost" mysqlfiles="/var/lib/mysql-files/" # Parse command line options while true; do #echo "option $1" case "$1" in # Options without arguments -h|--help) usage;; -d|--database) database="$2" ; shift ;; -t|--tables) tables="$2" ; shift ;; -o|--output) csvoutput="$2" ; shift ;; -u|--user) user="$2" ; shift ;; -hs|--host) host="$2" ; shift ;; -p|--password) password="$2" ; shift ;; -gs|--get-schema) option="getschema";; (--) shift; break;; (-*) echo "$0: error - unrecognized option $1" 1>&2; usage;; (*) break;; esac shift done # Checks if [ "$csvoutput" == "" ] then error "output CSV directory is not set" fi if [ "$database" == "" ] then error "MySQL database is not set" fi if [ "$user" == "" ] then error "MySQL user is not set" fi if [ "$password" == "" ] then error "MySQL password is not set" fi color_msg $blue "exporting tables of database $database" if [ "$tables" = "" ] then tables=$(echo "show tables" | domysql) fi case $option in getschema) rm $csvoutput$database.schema for table in $tables do color_msg $blue "getting schema for $table" echo -n "$table:" >> $csvoutput$database.schema getcolumns $table >> $csvoutput$database.schema done ;; *) for table in $tables do color_msg $blue "exporting table $table" cols=$(grep "$table:" $csvoutput$database.schema | cut -f2 -d:) if [ "$cols" = "" ] then cols=$(getcolumns $table) fi ssh $host rm $mysqlfiles/$table.csv cat <<EOF | mysql --host $host -u$user --password=$password $database SELECT $cols FROM $table INTO OUTFILE '$mysqlfiles$table.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'; EOF scp $host:$mysqlfiles/$table.csv $csvoutput$table.csv.raw (echo "$cols"; cat $csvoutput$table.csv.raw) > $csvoutput$table.csv rm $csvoutput$table.csv.raw done ;; esac
Wolfgang FahlChris Johnson 의 어깨 위에 서서 2016년 2월의 답변을 독서용 맞춤 방언으로 확장했습니다.
이 셸 파이프라인 도구는 데이터베이스에 연결할 필요가 없고 입력에서 임의의 쉼표와 따옴표를 처리하며 Python 2 및 Python 3에서 잘 작동합니다!
#!/usr/bin/env python import csv import sys # fields are separated by tabs; double-quotes may occur anywhere csv.register_dialect("mysql", delimiter="\t", quoting=csv.QUOTE_NONE) tab_in = csv.reader(sys.stdin, dialect="mysql") comma_out = csv.writer(sys.stdout, dialect=csv.excel) for row in tab_in: # print("row: {}".format(row)) comma_out.writerow(row)
해당 print 문을 사용하여 입력을 올바르게 구문 분석하고 있는지 확인하십시오. :)
주요 주의 사항: 캐리지 리턴 문자 처리, ^M aka control-M, \r Linux 용어. 배치 모드 MySQL 출력은 포함된 줄 바꿈 문자를 올바르게 이스케이프하므로 줄당 실제로 한 행(Linux 줄 바꿈 문자 \n으로 정의됨)이 있지만 MySQL은 열 데이터 주위에 따옴표를 사용하지 않습니다. 데이터 항목에 캐리지 리턴 문자가 포함된 경우 csv.reader는 다음 예외를 제외하고 해당 입력을 거부합니다.
new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
sys.stdin.fileno 를 'rU' 모드로 다시 열어 범용 파일 모드를 사용해야 한다고 @ me를 말하지 마십시오. 나는 그것을 시도했고 포함된 \r 문자가 레코드 끝 마커로 처리되도록 하므로 단일 입력 레코드가 많은 불완전한 출력 레코드로 잘못 변환됩니다.
Python의 csv.reader 모듈의 이러한 제한에 대한 Python 솔루션을 찾지 못했습니다. 근본 원인은 문서 csv.reader에 명시된 csv.reader 구현/제한이라고 생각합니다.
The reader is hard-coded to recognise either '\r' or '\n' as end-of-line, and ignores lineterminator.
내가 제공할 수 있는 약하고 불만족스러운 솔루션은 Python의 csv.reader가 데이터를 보기 전에 각 \r 문자를 2자리 시퀀스 '\n'으로 변경하는 것입니다. sed
명령을 사용했습니다. 다음은 위의 MySQL 선택 및 Python 스크립트가 있는 파이프라인의 예입니다.
mysql -u user db --execute="select * from table where id=12345" \ | sed -e 's/\r/\\n/g' \ | mysqlTsvToCsv.py
얼마 동안 이것과 싸우고 나면 Python이 올바른 솔루션이 아니라고 생각합니다. Perl 과 함께 살 수 있다면 artfulrobot에서 제공하는 한 줄짜리 스크립트 가 가장 효과적이고 간단한 솔루션이 될 수 있다고 생각합니다.
chrisinmtown출처 : http:www.stackoverflow.com/questions/356578/how-can-i-output-mysql-query-results-in-csv-format