首页 今日头条正文

六合宝典,怎么根据Python完成MySQL查询的API规划,附上完好脚本,海尔电热水器

这是学习笔记的第 2134 篇文章

咱们在平常的工作中不可避免会有衔接到数据库的操作,一般来说咱们会运用依据Shell的方法,或许依据数据库驱动的衔接方法,比方JDBC,ODBC,PyMySQL,MySQLdb等。

假如是依据Shell的方法,很简略呈现一个运用瓶颈,那便是假如经过shell去检查一个表的盲派三刀绝学数据,那么输出是没有标准的格局的,Shell履行是最简略最基本的调用方法,咱们也能够运用数据库服务端的特性来输出相应的数据格局,可是依据数据库版别的差异,有些低版别是不支持输出一些格局的,所以运用Shell来输出SQL查询的成果明显不是一个通用并且高雅的完结方法。

假如运用数据库发动,依据Python的方法便是一种很不错的挑选,咱们能够开发一个Python脚本,然后把这个Python脚本运用RESTful API的方法包装起来,这样对外的服务便是A张敬华邓煌PI而不是单一的脚本,并且可移植性和扩展性也要好许多。

大约的规划方法如下:

咱们由于版别的选型在这儿运用的是依据MySQLdb的完结方法,咱们来逐一剖析一下。

首要关于SQL查询来说,输出成果,履行时长,成果集行数等这些是咱们重视的一些六合宝典,怎样依据Python完结MySQL查询的API规划,附上无缺脚本,海尔电热水器数据,要完结这个功用,实际上要完结一揽子细微的功用。

1)运用MySQLdb或许其他驱动的默许情况下,输出的成果都是只要数据,而没有相应的列名等信息,咱们需求做一些弥补操作,输出为字段名和字段值的映射,比方{"id":100,"name":"aaa"}这索诺拉巫术商场样的方法,

2)依据Python驱动的输出时刻类型是映射datetime,关于前端处理来说也不行友爱,所以咱们要一并处理。

3)关于数据回来行数,默许是long行,咱们需求转化为整型

4)关于回来成果,默许是unicode,字符'abc'会显现相似为 u'abc'这种,咱们也需求做一层转化。

5)为了前端程序便利解析,咱们需求弥补一个字段列表,比方有字段id,name,咱们就回来一个数组或许列表,包括这些字段。

#! /usr/bin/env python

# _#_ coding:utf-8 _*_

import MySQLdb

import MySQLdb.cursors

import datetime

import json

import sys

def query(db_port,db_name,sql):

try:

return_dict = {}

starttime = datetime.datetime.now

conn = MySQLdb.connect(host='127.0.0.1', user='翁静晶香港风险人物jeanron', passwd='xxx凌潇潇姚晨为什么离婚x', db=db_name, port=int(db_port), charset='utf8')

cur = conn.cursor

cur.execute(sql)

rows = cur.fetchall

endtime = datetime.datetime.now

return_dict["executggdb我国官网ion_seconds"] = (endtime - starttime).seconds

index = cur.戒不住description

result =

for res in rows:

row = {}

for i in range(len(index)):

if type(res[i]) == datetime.datetime:

row[index[i][0萌族速泡净]] = res[i].strftime('%Y-%m-%d %H:%M:%S')

eli六合宝典,怎样依据Python完结MySQL查询的API规划,附上无缺脚本,海尔电热水器f type(res[i]) == int or type(res[i]) == long:

row[index[i][0]] = int(res[i])

elif六合宝典,怎样依据Python完结MySQL查询的API规划,附上无缺脚本,海尔电热水器 type(res[i]) == unicode:

row[index[i][宋鑫逝世0]]子午鸳鸯芯 = res[i].encode('utf8')

else:

print type(res[i])

ro夯先生w[index[i][0]] = res[i]

result.append(row)

if len(result) > 0:

column_list = result[0].keys

return_dict["column_list"] = column_list

return_dict["data_rows"] = int(cur.rowcount)

return_dict["table_data"] = resul六合宝典,怎样依据Python完结MySQL查询的API规划,附上无缺脚本,海尔电热水器t

cur.close

conn.close

return json.dumps(return_亿美互联dict)

except My陈梦竹SQLdb.Error as e:

print(e)


调用能够运用相似下面的代码方法:

sql_text="explain select * from test_data ;"

db_name='test'

db_port=int('3306')

测验没有问题止呕,很天然的能够运用参数化的方法:

sql_text=sys.argv[3]

db_port=sys.argv[1]

db_name=sys.argv[2]


为了封装为一个API,逻辑的部分完结有以下几个关键:

1)调用Python脚本,这儿咱们是经过Ansible的adhoc来完结的,当然也能够依据原生的paramiko等完结方法。

2)关于数据成果的回来,由于是一个调用-回来的逻辑关系,经过驱动有时候无法得到一些明细的信息,比方错误信息,咱们就需求故意处理几个场景,比方表不存在,SQL语法错误等。

完结的代码如下:

@api_view(['POST'])

def mysql_db_query(request):

try:

request_data = request.data.get("data")

sql_text_raw = request_data.get("sql_content")

ip_addr = request_data.get("ip_addr")

db_port = request_d夏如歌北冥幽ata.get("db_port")

db_name = request_data.get("db_name")

sql_text = sql_text_raw.replace("=","\=")

command = "/usr/local/DBA_SCRIPTS/mysql/mysql_db_query.py %s %s %s " % (db_port六合宝典,怎样依据Python完结MySQL查询的API规划,附上无缺脚本,海尔电热水器, db_name,"\""+sql_text+"\"")

result = ansible_adhoc("dba_mysql", ip_addr, "script", command, True)

print result

if result['success'][ip_addr][0].find("doesn\'t 六合宝典,怎样依据Python完结MySQL查询的API规划,附上无缺脚本,海尔电热水器exist")!= -1:

return MyJsonResponse(data={}, code=str(status.HTTP_500_INTERNAL_SERVER_ERROR),

message='query failed,table doesn\'t exists')

elif result['success'][ip_addr][0].find("error in your SQL syntax")!= -1:

return MyJsonResponse(data={}, code=str(status.HTTP_500_INTERNAL_SERVER_ERROR),

message='query failed,there is an error in your SQL syntax')

else:

return_data=json.loads(result['succes末世重生之百里心s'][ip_addr][0])

#print return_data

return MyJsonRespon六合宝典,怎样依据Python完结MySQL查询的API规划,附上无缺脚本,海尔电热水器se(data=return_data, code=str(status.HTTP_200_OK), message='success')

except MySQLdb.Erro欧美天体r as e:

print(e)

API的陈尚实输入参数样例为为:

{

"data": {

"ip_addr": "xxxx",

"db_port": "4306",

"db_name": "te卓鹿appst",

"sql_content":"select * from test_data where id>0"

}

}

一个比较抱负的输出样例如下:

{

"message": "success",

"code": "200",

"data": {

"data_rows": 10,

"execution_seconds": 0,

"column_list": [

"cdate",

"id",

"name"

],

"table_data": [

{

"cdate": "2019-10-14 18:49:16",

"id": 1,

"name": "aa"

},

{

"cdate": "2019-10-14 18:49:16",

"id": 2,

"name": "bb"

}

]

},

"pagenation":

}

我们在运用中有问题和定见也欢迎随时反应。

个人新书 《MySQL DBA时间前作笔记》

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。