建议:可以先运行脚本,查询效果,在阅读该文章,脚本在文章末尾
本节主要讲解利用pandas的read_sql来操作mysql数据库。准备条件:安装sqlalchemy,pandas
操作流程:
1,利用pandas获取从文件中获取sql语句,
2,利用sqlalchemy创建数据库引擎,
3,利用read_sql执行sql语句
select_test.sql中存储了1条sql格式化的sql语句:
select_order.sql文件
select
test_source,
test_channel,
order_id
from
test_order
where
order_id = '{parameter}'
利用自定义函数sql_read获取select_order.sql中的sql语句,sql_read如下:
# 格式化sql语句
def sql_read(self, file_path):
df = pd.read_csv(file_path, sep='\n', header=None)
sql = []
for value in df.values:
sql.append(value[0].strip())
sql = " ".join(sql)
return sql
运行sql_read效果如下:
select test_source, test_channel, order_id from test_order where order_id = '{parameter}'
自定义函数sql_suid来执行sql语句,由于利用pandas.read_sql来执行sql语句时,若执行增加、删除、更新命令时,会抛出异常
SourceCodeCloseError,并终止程序,故在设计sql_suid时,必须使用try...except来捕获异常
def sql_suid(self, sql):
# read_sql在执行增删改操作时,会抛出SourceCodeCloseError,并终止程序
try:
sql_data = pd.read_sql(sql, self.conn) # read_sql需要2个参数,sql语句和数据库链接引擎
return sql_data.values
except Exception as e:
print(e)
以上讲解的时最关键的2个函数,现附上脚本文件,大家可以先运行脚本,在来读文章,应该会更容易。
完整的脚本内容:
import pandas as pd
from sqlalchemy import create_engine
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
class mysqks(object):
# 初始化过程中的服务器信息请根据自己的实际信息进行改写
def __init__(self):
host = '12.15.16.23'
port = 1051
service = 'test_service'
user = 'test_uers'
password = 'testpwd'
connect_str = 'mydata+mysql://' + user + ':' + password + '@' + host + ":" + port + "/" + service
self.conn = create_engine(connect_str, max_identifier_length=128)
# 格式化sql语句
def sql_read(self, file_path):
df = pd.read_csv(file_path, sep='\n', header=None)
sql = []
for value in df.values:
sql.append(value[0].strip())
sql = " ".join(sql)
return sql
# 执行sql语句
def sql_suid(self, sql):
# read_sql在执行增删改操作时,会抛出SourceCodeCloseError,并终止程序
try:
sql_data = pd.read_sql(sql, self.conn) # read_sql需要2个参数,sql语句和数据库链接引擎
return sql_data.values
except Exception as e:
print(e)
if __name__ == "__main__":
order_id = '201902031835412009'
filepath = r'D:\select_order.sql'
conn = Oracles()
sql = conn.sql_read(filepath)
print(sql)
res = conn.sql_suid(sql.format(parameter=order_id))
print(res)