为实现Python对SQL脚本的自动化调用或批量执行,读取脚本内容自然是第一步,也是关键所在
规范化的SQL脚本是我们的最爱,代码处理也最为简单,如网文《20行Python代码执行SQL文件》、《Python执行SQL脚本》等
但是!
SQL脚本文件内容如果包含人为的、手写、不规范的、多种备注方式的 情况,该怎么处理呢?
以MySQL为例,备注内容的书写方式就有好几种,如下:
# 备注方式1
-- 备注方式2
/*
备注方式3
*/
select * from dual; # 备注方式4
select * from dual; -- 备注方式5
参考资料
如下方法实现MySQL脚本文件的读取,包含了对备注内容的处理,入参path 是脚本文件的绝对路径,出参为 SQL语句的字符串列表
def readSqlFile(path):
f = open(path, "r", encoding="UTF-8")
lines = f.readlines()
sqlList = []
thisSql = ""
mulNote = False
for line in lines:
string = str(line).strip()
if string == "":
continue
# part1 multi-line comment
if mulNote:
if string.startswith("*/"):
mulNote = False
continue
if string.startswith("/*"):
mulNote = True
continue
if string.startswith("#") or string.startswith("--"):
continue
strIn1 = False
strIn2 = False
for i in range(len(string)):
c = string[i]
# part2 string in sql
if "'" == c:
if not strIn1:
strIn1 = True
else:
strIn1 = False
continue
if '"' == c:
if not strIn2:
strIn2 = True
else:
strIn2 = False
continue
if strIn1 is True and strIn2:
continue
# part3 end of sql
if ";" == c:
string = string[0:(i + 1)]
break
# part4 comment behind of the sql
if "#" == c:
string = string[0:i]
break
if "-" == c and i <= len(string) - 2 \
and "-" == string[i + 1]:
string = string[0:i]
break
# part5 join multi-line for one sql
thisSql += " " + string
# part6 end of sql
if string.endswith(";"):
sqlList.append(copy.deepcopy(thisSql))
thisSql = ""
return sqlList
文章浏览阅读415次。在整个产品的Devops环节中,代码扫描是比较关键的一个环节,常见的工具有findbugs 、pmd、SonarQube等。SonarQube是一个代码质量管理的开源平台,用于检测代码中的错误、漏洞并确保代码规范。它可以与现有的工作流集成,以实现跨项目和拉取请求分支的代码检查,并支持Java、Python、PHP、JavaScript、CSS等25种以上的语言。SonarQube能够集成在IDE、Jenkins、Git等服务中,方便随时查看代码质量分析报告。SonarQube的核心价值有以下几点_mend io 扫描前端项目
文章浏览阅读1.5k次。文章目录1. 先修知识1.1 显卡1.2 显卡驱动1.3 Cuda1.4 Cudnn1.5 GPU1.6 **Nouveau**1.7 **GCC是GNU编译器套件**2. 检查本地配置3.NVIDIA显卡驱动安装3.1 官网下载run文件3.2 用指令查看版本3.3 删除旧的显卡驱动3.4 禁止自带的nouveau nvidia驱动3.5 修改bios设置3.6 安装驱动3.7 安装结束后重启电脑,再查看是否安装成功3.8 重新打开桌面3.9 或使用PPA仓库自动化安装**4. 安装CUDA****_intel graphics 630能够装conda
文章浏览阅读376次。Spring中@Import注解以及源码对@Import的解析_@import spring 问题
文章浏览阅读122次。1497 取余运算时间限制: 1 s空间限制: 128000 KB题目等级 : 钻石 Diamond题解查看运行结果题目描述Description输入b,p,k的值,编程计算bpmodk的值。其中的b,p,k*k为长整型数(2^31范围内)。输入描..._jmeter 取余
文章浏览阅读435次。使用phpmyadmin数据库导入出错:You probably tried to upload too large file!解决方法The first things to check (or ask your host provider to check) are the values ofupload_max_filesize,memory_limit and post_max__phpmyadmin 导入数据较大时,出现apache http server 已停止工作
文章浏览阅读268次。主Activity:[code="java"]package net.blogjava.mobile.map;import java.util.List;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import ..._google maps 根据输入地址,返回对应的地址组
文章浏览阅读224次。说在前面JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。优点如下[转]:1.占带宽小(格式是压缩的)2.js通过eval()进行Json读取(便于客户端读取)3. JSON支持多种语言(c、c++、PHP等),便于服务端解析关键代码json_encode( $arr ) <文档传送门>ajax ..._vue sql语句转json
文章浏览阅读7.4k次。GPS开发、定位修改修改于AOSPandroid7.1.1_r1NMF26Fopenjdk8.0Mint-linuxnexus5x原作者:https://blog.csdn.net/aggresss/article/details/54323034指出文中错误(自己编译时候遇到的)并修正固件共享出来是不可能的,谁知道我的固件里有没有后门,还是用源码自己编译的比较放心新鲜的源码..._virtualposition
文章浏览阅读903次。在Angular中组件和组件之间可以实现通信,而在 Ionic中每个page是一个模块,而模块里面的组件和其他 page 模块中的组件是无法直接通信的,此时就可以使用自定义模块间接的实现模块之间的通信,类似ng中的模块配置过程,把需要把 page(模块module)暴露出来给其他外部page(模块module)使用,实现步骤如【ionic自定义模块】所示。..._ionicmodule
文章浏览阅读263次。个人Java学习请求 —— 协议—— ip—— 端口号—— 资源路径端口号:运行时端口号才回被占用,未运行时端口号可以被其他使用是约束浏览器和服务的请求与响应,是特定数据交互格式,是一个超文本传输协议。作用:写一个美观的呈现程序且能交互的页面,html:书写静态的页面css:美化页面js:让页面能进行交互作用:给前端提供数据的,Java编程:让计算机帮人做事情程序:计算机能识别的是二进制,开发者不能使用二进制开发,使用字母,汉字,标点符号组成的高级语言进行编写虚拟机:Jvm将编写好的代码转换为计算机能看懂的_java 从入门到入坟
文章浏览阅读1.1w次,点赞3次,收藏31次。整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析_react生命周期
文章浏览阅读512次。Qt5 study1.QT5模板库1.1 字符串类 QString(传递const char*类型的ASCII字符串)操作字符串QString 提供+ ,+=的操作符QString::append()函数用于追加字符串,使用:str1.append(str2)QString::sprintf(): str.sprintf("%s,%s","welcome ",“to you”) 相..._学qt需要学模版吗