私は次のものを持っています:
import MySQLdb as dbapi
import sys
import csv
dbServer='localhost'
dbPass='supersecretpassword'
dbSchema='dbTest'
dbUser='root'
dbQuery='SELECT * FROM pbTest.Orders;'
db=dbapi.connect(host=dbServer,user=dbUser,passwd=dbPass)
cur=db.cursor()
cur.execute(dbQuery)
result=cur.fetchall()
c = csv.writer(open("temp.csv","wb"))
c.writerow(result)
これにより、文字化けが発生します。印刷レコード [0] などの使用に慣れています。書式設定をどのように設定すればよいかわかりません。コンソールでのクエリのようなものを生成します。mysql サーバーから単純な INTO OUTFILE を実行できません。
アップデート
8 年が経ちました。この質問については、今でも時折最新情報やクエリを受け取ります。
いくつかのコメントで述べたように、DBAPIの cursor.description は私が探していたものです。
pymysqlドライバーを使用してMariaDBに接続するPython 3 の最新の例を次に示します。これは、すべての行を選択してタプルにフェッチし、行ヘッダー/説明をリストにフェッチします。次に、これら 2 つのデータ構造を 1 つのリストにマージして、csv ファイルに書き込みます。
ヘッダー名が結果リストの最初のエントリになります。結果を線形にファイルに書き込むことで、行ヘッダーが CSV ファイルの最初の行になるようにします。
import pymysql
import csv
import sys
db_opts = {
'user': 'A',
'password': 'C',
'host': 'C',
'database': 'D'
}
db = pymysql.connect(**db_opts)
cur = db.cursor()
sql = 'SELECT * from schema_name.table_name where id=123'
csv_file_path = '/tmp/my_csv_file.csv'
try:
cur.execute(sql)
rows = cur.fetchall()
finally:
db.close()
# Continue only if there are rows returned.
if rows:
# New empty list called 'result'. This will be written to a file.
result = list()
# The row name is the first entry for each entity in the description tuple.
column_names = list()
for i in cur.description:
column_names.append(i[0])
result.append(column_names)
for row in rows:
result.append(row)
# Write result to file.
with open(csv_file_path, 'w', newline='') as csvfile:
csvwriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
for row in result:
csvwriter.writerow(row)
else:
sys.exit("No rows found for query: {}".format(sql))