__init__.py 26 KB

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