__init__.py 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from re import S
  4. from fastapi import APIRouter, Request, Depends, Form, Body, File, UploadFile, BackgroundTasks
  5. from fastapi.responses import Response
  6. from fastapi.responses import JSONResponse
  7. from database import get_db
  8. from sqlalchemy.orm import Session
  9. from utils import *
  10. from models import *
  11. from urllib import parse
  12. from common.DBgetdata import dbgetdata
  13. from pprint import pprint
  14. from datetime import datetime
  15. # import pandas as pd
  16. from pydantic import BaseModel
  17. import sqlalchemy
  18. import pymysql
  19. import json,time,io
  20. import time, os
  21. import math
  22. import uuid
  23. import re
  24. from . import sign_api
  25. from . import skwhp_api
  26. router = APIRouter()
  27. router.include_router(sign_api.router)
  28. router.include_router(skwhp_api.router)
  29. def contains_special_characters(input_string, special_characters=";|&|$|#|'|@"):
  30. """
  31. 判断字符串是否包含特殊符号。
  32. :param input_string: 需要检查的字符串
  33. :param special_characters: 特殊符号的字符串,多个符号用竖线 '|' 分隔
  34. :return: 如果包含特殊符号返回 True,否则返回 False
  35. """
  36. # 创建正则表达式模式
  37. pattern = re.compile('[' + re.escape(special_characters) + ']')
  38. # 搜索字符串中的特殊符号
  39. if pattern.search(input_string):
  40. return True
  41. return False
  42. @router.get('/v1/demo')
  43. @router.post('/v1/demo')
  44. async def test1(request: Request):
  45. data = await request.body()
  46. body = data.decode(encoding='utf-8')
  47. # print(body)
  48. if len(body) > 0:
  49. body = json.loads(body)
  50. print(body)
  51. print([body,{'msg':'good'}])
  52. return body
  53. else:
  54. return body
  55. @router.post('/create_api_service')
  56. async def create_api_service(
  57. request: Request,
  58. db: Session = Depends(get_db)
  59. ):
  60. # print(1)
  61. data = await request.body()
  62. body = data.decode(encoding='utf-8')
  63. if len(body) > 0:
  64. # print(body)
  65. body = json.loads(body)
  66. serviceid = str(uuid.uuid4()).replace("-","")
  67. serviname = body['servicename']
  68. datasource = str(uuid.uuid1())
  69. sqlname = body['sqlname']
  70. id = str(uuid.uuid4())
  71. dbtype = body['dbtype']
  72. if body['dbtype'] == 'pymysql':
  73. host = body['host']
  74. user = body['user']
  75. password = body['password']
  76. database = body['database']
  77. port = body['port']
  78. charset = body['charset']
  79. create_datasource = DatasourceEntity(id= datasource,name=sqlname,scope=serviceid,dbtype=dbtype,host=host,user=user,password=password,database=database,port=port,charset=charset)
  80. # db.add()
  81. # print()
  82. db.add(create_datasource)
  83. sqltext = body['sqltext']
  84. create_command = CommandEntity(id=id,sqltext=sqltext,datasource=datasource,scope=serviceid)
  85. create_api = ApiServiceEntity(id=serviceid,name=serviname)
  86. db.add(create_api)
  87. db.add(create_command)
  88. db.commit()
  89. return serviceid
  90. @router.get('/v1/{service_code:path}')
  91. @router.post('/v1/{service_code:path}')
  92. async def v1(request: Request, background_tasks: BackgroundTasks, db: Session = Depends(get_db)):
  93. service_code = request.path_params.get('service_code')
  94. query_list = parse.parse_qsl(str(request.query_params))
  95. print(query_list)
  96. data = await request.body()
  97. body = data.decode(encoding='utf-8')
  98. if len(body) > 0:
  99. print('[body]', body)
  100. body = json.loads(body)
  101. # print("1111",body)
  102. service_info = db.query(ApiServiceEntity).filter(ApiServiceEntity.id == service_code).first()
  103. if service_info is None:
  104. return {
  105. 'errcode': 1,
  106. 'errmsg': '服务不存在'
  107. }
  108. # print(service_info)
  109. print('service_name', service_info.name)
  110. # print('database_name', database_info.name, database_info.dsn)
  111. command_info = db.query(CommandEntity).filter(CommandEntity.scope == service_code).first()
  112. if command_info is None:
  113. return {
  114. 'errcode': 1,
  115. 'errmsg': '查询命令没配置'
  116. }
  117. database_info = db.query(DatasourceEntity).filter(DatasourceEntity.id == command_info.datasource).first()
  118. if database_info is None:
  119. return {
  120. 'errcode': 1,
  121. 'errmsg': '数据库没配置'
  122. }
  123. sql = command_info.sqltext
  124. print('sql ==== << ', sql)
  125. meta_data = {}
  126. # 从query获取参数
  127. for (key, val) in query_list:
  128. if key != 'access_token' and key !='page' and key != 'limit' and key !='create_time' and key != 'record_name'and key != 'record_cid':
  129. sql = sql.replace("{" + key + "}", val.replace('全部',''))
  130. elif key =='create_time':
  131. if val != '全部':
  132. sql = sql.replace("{" + key + "}", ('DATE_FORMAT(create_time,\'%Y-%m-%d\') =\''+val+'\' and')) #DATE_FORMAT(create_time,'%Y-%m-%d') ='{create_time}'
  133. else:
  134. sql = sql.replace("{" + key + "}", '')
  135. elif key =='record_name' or key =='record_cid' :
  136. if val != '全部':
  137. sql = sql.replace("{" + key + "}", (key+'=\''+val+'\' and'))
  138. else:
  139. sql = sql.replace("{" + key + "}", '')
  140. # elif key =='record_cid':
  141. # if val != '全部':
  142. # sql = sql.replace("{" + key + "}", ('record_name =\''+val+'\' and'))
  143. # else:
  144. # print(111)
  145. # sql = sql.replace("{" + key + "}", '')
  146. elif key =='page' :
  147. meta_data['page'] = int(val)
  148. elif key == 'limit':
  149. meta_data['limit'] = int(val)
  150. # 从json body获取参数
  151. if len(body) > 0:
  152. print(body)
  153. for (key, val) in body.items():
  154. if key == 'page1' and 'limit1' in body:
  155. if val==-1:
  156. pass
  157. if val == '':
  158. val = '0'
  159. page1 = int(val)
  160. limit1=int(body['limit1'])
  161. print(str((page1-1)*limit1))
  162. sql = sql.replace('{page1}',str((page1-1)*limit1))
  163. # elif key == 'limit1' and 'page1' in body:
  164. # page1 = int(body['page1'])
  165. # limit1 = int(val)
  166. # sql.replace('{page1}', str((page1-1)*limit1))
  167. elif key !='page' and key != 'limit' and key !='create_time':
  168. if isinstance(val, int):
  169. val = str(val)
  170. if isinstance(val, float):
  171. val = str(val)
  172. sql = sql.replace("{" + key + "}", val)
  173. elif key =='create_time':
  174. if val != '全部':
  175. sql = sql.replace("{" + key + "}", ('DATE_FORMAT(create_time,\'%Y-%m-%d\') =\''+val+'\' and')) #DATE_FORMAT(create_time,'%Y-%m-%d') ='{create_time}'
  176. else:
  177. sql = sql.replace("{" + key + "}", '')
  178. elif key =='page' :
  179. if isinstance(val, str):
  180. meta_data['page'] = int(val)
  181. elif isinstance(val, int):
  182. meta_data['page'] = val
  183. elif key == 'limit':
  184. if isinstance(val, str):
  185. meta_data['limit'] = int(val)
  186. elif isinstance(val, int):
  187. meta_data['limit'] = val
  188. elif key == 'taskNo' and val=='':
  189. print("他们又输入空的taskNo啦!")
  190. return [{"text":"兄弟,taskNo不能为空"}]
  191. print('sql ==== >> ', sql)
  192. data = []
  193. if database_info.dbtype == 'psycopg2':
  194. '''
  195. print(1111)
  196. conn = psycopg2.connect(database_info.dsn)
  197. cur = conn.cursor()
  198. cur.execute(sql)
  199. rows = cur.fetchall()
  200. # 字段名列表
  201. colnames = [desc[0] for desc in cur.description]
  202. item = {}
  203. for row in rows:
  204. for col in range(len(colnames)):
  205. field_name = colnames[col]
  206. item[field_name] = row[col]
  207. data.append(item)
  208. conn.close()
  209. '''
  210. elif database_info.dbtype == 'pymysql':
  211. # print(database_info)
  212. conn = pymysql.connect(host=database_info.host,
  213. user=database_info.user,
  214. password=database_info.password,
  215. database=database_info.database,
  216. port=database_info.port,
  217. charset=database_info.charset)
  218. cur = conn.cursor()
  219. cur.execute(sql)
  220. rows = cur.fetchall()
  221. # 字段名列表
  222. colnames = [desc[0] for desc in cur.description]
  223. # print(colnames)
  224. # print(rows)
  225. pages = 1 #总页数
  226. current = 1 #第几页
  227. total = len(rows)
  228. size = len(rows)
  229. # print(size)
  230. if 'page' in meta_data and 'limit' in meta_data:
  231. current = meta_data['page']
  232. size = meta_data['limit']
  233. if (current == 0 or size == 0) and total != 0:
  234. current = 1
  235. size = 5
  236. pages = total//size
  237. if total%size !=0:
  238. pages+=1
  239. start_index = (current-1)*size
  240. end_index = current*size
  241. if pages <= current :
  242. # current = pages
  243. if total == size :
  244. end_index = (current-1)*size+total
  245. elif total%size == 0:
  246. end_index = current*size
  247. else:
  248. end_index = (current-1)*size+total%size
  249. start_index = (current-1)*size
  250. if total ==0:
  251. start_index = end_index =0
  252. # print(start_index,end_index)
  253. for row in range(start_index,end_index):
  254. item = {}
  255. for col in range(len(colnames)):
  256. field_name = colnames[col]
  257. item[field_name] = rows[row][col]
  258. data.append(item)
  259. # print(item)
  260. # for row in rows:
  261. # item = {}
  262. # for col in range(len(colnames)):
  263. # field_name = colnames[col]
  264. # item[field_name] = row[col]
  265. # data.append(item)
  266. # print(item)
  267. # print(data)
  268. conn.close()
  269. return {
  270. 'code': 0,
  271. 'errcode': 0,
  272. 'errmsg': '查询成功',
  273. 'data': {"list":data,
  274. 'pages':pages, # 总页数
  275. 'currentPage':current, #当前页数
  276. # 'current':current,
  277. # 'total' : total,
  278. 'total' : total, # 总数据量
  279. # 'size':size,
  280. 'pageSize':size #页码
  281. }
  282. }
  283. # import time
  284. # print(time)
  285. # if 'ispages' in body:
  286. # try:
  287. # if body['ispages']=='1':
  288. # return {
  289. # 'page': [{"total": pages,
  290. # "page": current}],
  291. # "data":data
  292. # }
  293. # # data['pages'] =
  294. # except:
  295. # pass
  296. #
  297. # #background_tasks.add_task(post_service_method, service_code, body, db)
  298. #
  299. # return data
  300. class CreateApiServiceFrom(BaseModel):
  301. datasource:str
  302. name:str
  303. sqltext:str
  304. serviceid:str=None
  305. @router.post('/v2/create_api_service')
  306. async def create_api_service_v2(
  307. form_data: CreateApiServiceFrom,
  308. request: Request,
  309. db: Session = Depends(get_db)
  310. ):
  311. # print(1)
  312. data = await request.body()
  313. body = data.decode(encoding='utf-8')
  314. if len(body) > 0:
  315. # print(body)
  316. body = json.loads(body)
  317. for param in ['datasource','name','sqltext']:
  318. if param not in body or body[param]=='':
  319. return f'{param}为必填参数,不能不存在'
  320. # 数据库信息校验
  321. datasource = form_data.datasource
  322. database_info = db.query(DatasourceEntity).filter(DatasourceEntity.id == datasource).first()
  323. if database_info is None:
  324. return JSONResponse(status_code=410, content={
  325. 'errcode': 410,
  326. 'errmsg': f'数据库-{datasource}-不存在'
  327. })
  328. # 接口信息生成及获取
  329. if form_data.serviceid is None:
  330. serviceid = str(uuid.uuid4()).replace("-","")
  331. else:
  332. serviceid = form_data.serviceid
  333. serviname = form_data.name
  334. id = str(uuid.uuid4())
  335. sqltext = form_data.sqltext
  336. # 接口执行校验
  337. if database_info.dbtype == 'pymysql':
  338. try:
  339. conn = pymysql.connect(host=database_info.host,
  340. user=database_info.user,
  341. password=database_info.password,
  342. database=database_info.database,
  343. port=database_info.port,
  344. charset=database_info.charset)
  345. cur = conn.cursor()
  346. # 测试返回
  347. sql = sqltext+' limit 0;'
  348. print(sql)
  349. cur.execute(sql)
  350. colnames = [desc[0] for desc in cur.description]
  351. cur.close()
  352. conn.close()
  353. except Exception as e:
  354. # 捕获其他所有类型的异常
  355. return f"未知错误: {e}"
  356. else:
  357. return '暂不支持除pymysql以外的驱动'
  358. create_command = CommandEntity(id=id,sqltext=sqltext,datasource=datasource,scope=serviceid)
  359. create_api = ApiServiceEntity(id=serviceid,name=serviname,status=1)
  360. db.add(create_api)
  361. db.add(create_command)
  362. db.commit()
  363. return [serviceid,colnames]
  364. @router.post('/v2/update_api_service')
  365. async def update_api_service_v2(
  366. request: Request,
  367. db: Session = Depends(get_db)
  368. ):
  369. # print(1)
  370. data = await request.body()
  371. body = data.decode(encoding='utf-8')
  372. if len(body) > 0:
  373. # print(body)
  374. body = json.loads(body)
  375. for param in ['id','datasource','scope','name','sqltext','status']:
  376. if param not in body or body[param]=='':
  377. return f'{param}为必填参数,不能不存在'
  378. # 数据库信息校验
  379. datasource = body['datasource']
  380. database_info = db.query(DatasourceEntity).filter(DatasourceEntity.id == datasource).first()
  381. if database_info is None:
  382. return JSONResponse(status_code=410, content={
  383. 'errcode': 410,
  384. 'errmsg': f'数据库-{datasource}-不存在'
  385. })
  386. serviceid = body['scope']
  387. # 判断请求接口是否存在
  388. service_info = db.query(ApiServiceEntity).filter(ApiServiceEntity.id == serviceid).first()
  389. if service_info is None:
  390. return JSONResponse(status_code=410, content={
  391. 'code': 410,
  392. 'msg': f'servicecode{serviceid}服务不存在'
  393. })
  394. command_info = db.query(CommandEntity).filter(CommandEntity.scope == serviceid).first()
  395. if command_info is None:
  396. return JSONResponse(status_code=410, content={
  397. 'code': 410,
  398. 'msg': f'servicecode{serviceid}服务不存在'
  399. })
  400. # 接口信息生成及获取
  401. id = body['id']
  402. serviname = body['name']
  403. sqltext = body['sqltext']
  404. status = body['status']
  405. # 接口执行校验
  406. if database_info.dbtype == 'pymysql':
  407. try:
  408. conn = pymysql.connect(host=database_info.host,
  409. user=database_info.user,
  410. password=database_info.password,
  411. database=database_info.database,
  412. port=database_info.port,
  413. charset=database_info.charset)
  414. cur = conn.cursor()
  415. # 测试返回
  416. sql = sqltext+' limit 0;'
  417. print(sql)
  418. cur.execute(sql)
  419. colnames = [desc[0] for desc in cur.description]
  420. cur.close()
  421. conn.close()
  422. except Exception as e:
  423. # 捕获其他所有类型的异常
  424. return f"未知错误: {e}"
  425. else:
  426. return '暂不支持除pymysql以外的驱动'
  427. # create_command = CommandEntity(id=id,sqltext=sqltext,datasource=datasource,scope=serviceid)
  428. # create_api = ApiServiceEntity(id=serviceid,name=serviname,status=1)
  429. # db.add(create_api)
  430. # db.add(create_command)
  431. service_info.id=serviceid
  432. service_info.name=serviname
  433. service_info.status=status
  434. command_info.id=id
  435. command_info.sqltext=sqltext
  436. command_info.datasource=datasource
  437. command_info.scope=serviceid
  438. db.commit()
  439. return [serviceid,colnames]
  440. @router.post('/v2/create_datasource')
  441. async def create_create_datasource_v2(
  442. request: Request,
  443. db: Session = Depends(get_db)
  444. ):
  445. # print(1)
  446. data = await request.body()
  447. body = data.decode(encoding='utf-8')
  448. if len(body) > 0:
  449. # print(body)
  450. body = json.loads(body)
  451. # 检查入参
  452. for param in ['datasourcename','dbtype','host','user','password','database','port','charset']:
  453. if param not in body or body[param]=='':
  454. return f'{param}为必填参数,不能不存在'
  455. datasource = str(uuid.uuid1())
  456. datasourcename = body['datasourcename']
  457. dbtype = body['dbtype']
  458. if body['dbtype'] == 'pymysql':
  459. host = body['host']
  460. user = body['user']
  461. password = body['password']
  462. database = body['database']
  463. port = body['port']
  464. charset = body['charset']
  465. # 数据库连通性校验
  466. try:
  467. conn = pymysql.connect(host=host,
  468. user=user,
  469. password=password,
  470. database=database,
  471. port=port,
  472. charset=charset)
  473. cur = conn.cursor()
  474. # 测试返回
  475. sql = ' select now()'
  476. print(sql)
  477. cur.execute(sql)
  478. testresult = cur.fetchall()
  479. cur.close()
  480. conn.close()
  481. except Exception as e:
  482. # 捕获其他所有类型的异常
  483. return f"未知错误: {e}"
  484. create_datasource = DatasourceEntity(id=datasource, name=datasourcename, scope='', dbtype=dbtype, host=host,
  485. user=user, password=password, database=database, port=port,
  486. charset=charset)
  487. db.add(create_datasource)
  488. else:
  489. return f'暂不支持{dbtype}'
  490. db.commit()
  491. return [datasource,testresult]
  492. @router.post('/v2/update_datasource')
  493. async def create_update_datasource_v2(
  494. request: Request,
  495. db: Session = Depends(get_db)
  496. ):
  497. # print(1)
  498. data = await request.body()
  499. body = data.decode(encoding='utf-8')
  500. if len(body) > 0:
  501. # print(body)
  502. body = json.loads(body)
  503. # 检查入参
  504. for param in ['id','datasourcename','dbtype','host','user','password','database','port','charset']:
  505. if param not in body or body[param]=='':
  506. return f'{param}为必填参数,不能不存在'
  507. # 根据数据库id检测是否存在
  508. datasource = body['id']
  509. database_info = db.query(DatasourceEntity).filter(DatasourceEntity.id == datasource).first()
  510. if database_info is None:
  511. return JSONResponse(status_code=410, content={
  512. 'errcode': 410,
  513. 'errmsg': f'数据库{datasource}不存在'
  514. })
  515. datasourcename = body['datasourcename']
  516. dbtype = body['dbtype']
  517. if body['dbtype'] == 'pymysql':
  518. host = body['host']
  519. user = body['user']
  520. password = body['password']
  521. database = body['database']
  522. port = body['port']
  523. charset = body['charset']
  524. # 数据库连通性校验
  525. try:
  526. conn = pymysql.connect(host=host,
  527. user=user,
  528. password=password,
  529. database=database,
  530. port=port,
  531. charset=charset)
  532. cur = conn.cursor()
  533. # 测试返回
  534. sql = ' select now()'
  535. print(sql)
  536. cur.execute(sql)
  537. testresult = cur.fetchall()
  538. cur.close()
  539. conn.close()
  540. except Exception as e:
  541. # 捕获其他所有类型的异常
  542. return f"未知错误: {e}"
  543. # create_datasource = DatasourceEntity(id=datasource, name=datasourcename, scope='', dbtype=dbtype, host=host,
  544. # user=user, password=password, database=database, port=port,
  545. # charset=charset)
  546. # db.add(create_datasource)
  547. database_info.name = datasourcename
  548. database_info.dbtype = dbtype
  549. database_info.host = host
  550. database_info.user = user
  551. database_info.password = password
  552. database_info.database = database
  553. database_info.port = port
  554. database_info.charset = charset
  555. else:
  556. return f'暂不支持{dbtype}'
  557. db.commit()
  558. return [datasource,testresult]
  559. @router.get('/v2/{serviceid}')
  560. @router.post('/v2/{serviceid}')
  561. # @router.post('/v2/{servicecode}')
  562. async def v2(serviceid:str,request: Request, db: Session = Depends(get_db)):
  563. # 获取请求头 servicecode
  564. # if service_code is None:
  565. # service_code = request.headers.get('servicecode')
  566. # print(serviceid)
  567. if serviceid is None:
  568. return JSONResponse(status_code=410, content= {
  569. 'code': 410,
  570. 'msg': "请求头servicecode未传参"
  571. })
  572. # 判断请求接口是否存在
  573. service_info = db.query(ApiServiceEntity).filter(ApiServiceEntity.id == serviceid).first()
  574. if service_info is None:
  575. return JSONResponse(status_code=410, content={
  576. 'code': 410,
  577. 'msg': 'servicecode服务不存在'
  578. })
  579. # print(service_code)
  580. # 判断请求接口对应数据库是否存在
  581. command_info = db.query(CommandEntity).filter(CommandEntity.scope == serviceid).first()
  582. if command_info is None:
  583. return JSONResponse(status_code=410, content={
  584. 'code': 410,
  585. 'msg': '查询命令没配置'
  586. })
  587. # 判断请求接口对应数据库是否存在
  588. database_info = db.query(DatasourceEntity).filter(DatasourceEntity.id == command_info.datasource).first()
  589. if database_info is None:
  590. return JSONResponse(status_code=410, content={
  591. 'errcode': 410,
  592. 'errmsg': '数据库没配置'
  593. })
  594. # 获取接口对应的sql
  595. sql = command_info.sqltext
  596. print('sql ==== << ', sql)
  597. # 从params和body获取参数
  598. # query_list = parse.parse_qsl(str(request.query_params))
  599. # print(query_list)
  600. data = await request.body()
  601. body = data.decode(encoding='utf-8')
  602. size = 10
  603. current = 1
  604. if len(body) > 0:
  605. body = json.loads(body)
  606. # 分页器 页数和页码的设置
  607. if "size" in body:
  608. if isinstance(body['size'], str):
  609. size = int(body['size'])
  610. elif isinstance(body['size'], int):
  611. size = body['size']
  612. if size >100:
  613. size = 100
  614. if "current" in body:
  615. if isinstance(body['current'], str):
  616. current = int(body['current'])
  617. elif isinstance(body['current'], int):
  618. current = body['current']
  619. if current<=0:
  620. current=1
  621. # 接口sql的参数替换
  622. if 'query' in body:
  623. for (key, val) in body['query'].items():
  624. if isinstance(val, int):
  625. val = str(val)
  626. if isinstance(val, float):
  627. val = str(val)
  628. if contains_special_characters(val):
  629. return JSONResponse(status_code=411, content={
  630. 'code': 411,
  631. 'msg': f'参数{key}含特殊符号:;、&、$、#、\'、\\t、@、空格等'
  632. })
  633. sql = sql.replace("{" + key + "}", val)
  634. print('sql ==== >> ', sql)
  635. data = []
  636. # 数据库类型为mysql情况下
  637. if database_info.dbtype == 'pymysql':
  638. # 数据库连接
  639. conn = pymysql.connect(host=database_info.host,
  640. user=database_info.user,
  641. password=database_info.password,
  642. database=database_info.database,
  643. port=database_info.port,
  644. charset=database_info.charset)
  645. cur = conn.cursor()
  646. # 查总数据量,分页数据处理
  647. totalsql = f'select count(*) from ({sql})t'
  648. print(totalsql)
  649. cur.execute(totalsql)
  650. total = cur.fetchone()[0]
  651. pages,pagesmod = divmod(total, size)
  652. print(total,pages,pagesmod)
  653. if pagesmod!=0:
  654. pages+=1
  655. print(pages,pagesmod)
  656. if total <size :
  657. size = total
  658. # 正式查询
  659. sql = sql+f' limit {size*(current-1)}, {size};'
  660. print(sql,size)
  661. cur.execute(sql)
  662. rows = cur.fetchall()
  663. colnames = [desc[0] for desc in cur.description]
  664. for row in range(len(rows)):
  665. item = {}
  666. for col in range(len(colnames)):
  667. field_name = colnames[col]
  668. item[field_name] = rows[row][col]
  669. data.append(item)
  670. # 数据库关闭
  671. cur.close()
  672. conn.close()
  673. else:
  674. return JSONResponse(status_code=410, content={
  675. 'code': 410,
  676. 'msg': '接口对应数据库暂不支持'
  677. })
  678. return {
  679. 'code': 0,
  680. 'msg': 'success',
  681. 'rows': data,
  682. 'pages': pages, # 总页数
  683. 'currentPage': current, # 当前页数
  684. # 'current':current,
  685. # 'total' : total,
  686. 'total': total, # 总数据量
  687. # 'size':size,
  688. 'pageSize': size # 页码
  689. }
  690. # else:
  691. # return JSONResponse(status_code=410, content={
  692. # 'code': 410,
  693. # 'msg': 'body不能为空'
  694. # })