我想去数据库里面取出数据。
如果我有数据库下面含很多个表。
在此之前,我们给出一个读取数据库密码和用户名等基本配置的一个包:
# import the dbconfig
import sys
import json
import mysql.connector
import re
def connect(db_config):
try:
with open(db_config) as json_data_file:
config = json.load(json_data_file)
cnx = mysql.connector.connect(**config)
return cnx
except IOError as e:
print("I/O error({0}), {1}: {2}".format(e.errno, e.strerror, db_config))
raise
except:
print("Unexpected error:", sys.exc_info()[0])
raise
def connectStr(db_type, db_config):
if db_type.lower() == 'mysql':
port = '3306'
charset = "?charset=utf8"
elif db_type.lower() == 'postgresql':
port = '5432'
charset = ""
try:
with open(db_config) as json_data_file:
config = json.load(json_data_file)
str = db_type + "://" + config["user"]+":" + config["password"] + "@" + config["host"]+ ":" + port + "/" +config["database"] + charset
return str
except IOError as e:
print("I/O error({0}), {1}: {2}".format(e.errno, e.strerror, db_config))
raise
except:
print("Unexpected error:", sys.exc_info()[0])
raise
我需要你把这个这个代码命名为dbconfig_importer.py,记住,这是我们自定义的一个库。
我们的json数据库配置格式应该如下:
{
"user": "user",
"password": " **********",
"host": "********",
"database": "*****",
"raise_on_warnings": false
}
下面给出python操作mysql的代码,首先,你要去
pip install mysql-connector-python这个包
方法一:
import mysql.connector
import os
import sys
import csv
import codecs
sys.path.append(r"F:\lib")
#导入自定义的包
import dbconfig_importer
#这个数据库json文件自己配置就可以了,下面的json文件存储你的密码和用户名配置信息
db_config = r"F:\cfg\database_config.json"
tmp_dir = r"D:\da"
cnx = dbconfig_importer.connect(db_config)
query_cursor = cnx.cursor()
#有许多的表,我们需要定义一个函数
def csv_appdp(dp_table):
counter=0
query="SELECT * FROM appdp." + dp_table
query_cursor.execute(query)
appdp_csv_file = tmp_dir + '\\'+ dp_table + ".csv"
appdp_csvfile = codecs.open(appdp_csv_file,'w', 'utf-8')
dp_writer = csv.writer(appdp_csvfile)
while True:
rows = query_cursor.fetchone()
desc = query_cursor.description
#定义一个空的列表来存入表头
header=[]
for i in desc:
header.append(i[0])
#将第一行的表头数据写入文件
if counter==0:
dp_writer.writerow(header)
ifnot rows: break
dp_writer.writerow(rows)
counter += 1
csv_appdp("a")
csv_appdp("b")
csv_appdp("c")
csv_appdp("d")
csv_appdp("e")
csv_appdp("f")
query_cursor.close()
cnx.close()
appdp_csvfile.close()
方法二:
其实这个代码更加高效:
import mysql.connector
import os
import sys
import re
import csv
import pandas as pd
sys.path.append(r"F:\BQS_ETL v0.2\lib")
#这个数据库json文件自己配置就可以了
import dbconfig_importer
db_config = r"F:\BQS_ETL v0.2\cfg\database_config.json"
tmp_dir = r"D:\mili\Datamart\rawdata_csv_py\applend"
cnx = dbconfig_importer.connect(db_config)
query_cursor = cnx.cursor()
def csv_applend(lend_table):
query="SELECT * FROM applend." + lend_table
#直接使用pandas读取到dataframe里面,再写入本地的文件
df = pd.read_sql(query,cnx)
applend_csv_file = tmp_dir + '\\'+ lend_table + ".csv"
df.to_csv(applend_csv_file,encoding = "utf-8" ,index = False)
table = [
"a",
"b",
"c",
"d",
"e",
"f"]
for lend_table in table:
csv_applend(lend_table)
query_cursor.close()
cnx.close()