首页 雷火电竞app正文

化妆的正确步骤,怎么根据Python完成MySQL查询的API规划,附上完好脚本-雷火电竞

admin 雷火电竞app 2019-12-02 223 0

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

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

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

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

大约的规划方法如下:

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

首要关于SQL查询来说,输出成果,履行时长,成果集行数等这些是咱们重视的一些数据,要完成这个功用,实际上要完成一揽子细微的功用。

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='xxxx', db=db_name, port=int(db_port), charset='utf8')

cur = conn.cursor

cur.execute(sql)

rows = cur.fetchall

endtime = datetime.datetime.now

return_dict["execution_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')

elif type(res[i]) == int or type(res[i]) == long:

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

elif type(res[i]) == unicode:

row[index[i][0]] = res[i].encode('utf8')

else:

print type(res[i])

row[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"] = result

cur.close

conn.close

return json.dumps(return_dict)

except MySQLdb.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_data.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, 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 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['success'][ip_addr][0])

#print return_data

return MyJsonResponse(data=return_data, code=str(status.HTTP_200_OK), message='success')

except MySQLdb.Error as e:

print(e)

API的输入参数样例为为:

{

"data": {

"ip_addr": "xxxx",

"db_port": "4306",

"db_name": "test",

"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作业笔记》

雷火电竞版权声明

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

哈尔滨医科大学,扬子地板分红预案出炉:拟每10股派发现金3元-雷火电竞

  • 笠翁对韵,网达软件11月19日快速上涨-雷火电竞

    笠翁对韵,网达软件11月19日快速上涨-雷火电竞

  • 鲎,世界实业11月19日快速上涨-雷火电竞

    鲎,世界实业11月19日快速上涨-雷火电竞

  •   据了解,西上海站坐落上海嘉定区百安公路与恒裕路交叉口,占地4400平方米,安智站坐落上海嘉定区安智路700号,占地3500多平方米,两站日加氢才能达1000公斤,可满意200辆氢燃料物流车的正常运营,单车次均匀加注时刻不超越五分钟。

      据悉,两站各配套2台双枪加氢机,2台排量为80公斤/小时的压缩机及3台储氢罐以及一台低压储氢瓶组,可满意4辆车一起加注。该项目由液空厚普引入世界先进

  • kms激活工具,再创榜首!厚普股份助力中石化第一批上海加氢站投入运营-雷火电竞

    最近发表

    雷火电竞_雷火电竞官网_雷火电竞app

    http://www.zachita.com/

    |

    Powered By

    使用手机软件扫描微信二维码

    关注我们可获取更多热点资讯

    雷火电竞出品