有一个 sql 文件, 是别的模块在安装的时候需要的,
内容应该是从数据库导出的, 1000+行,
找了很多范例, 大部分是默认没有注释, 用结束符做分割来分条插入,
在 so 还找到了一个 mysql 官方的示例:
import mysql.connector
cnx = mysql.connector.connect(database='world')
cursor = cnx.cursor()
cursor.execute(operation, params=None, multi=False)
iterator = cursor.execute(operation, params=None, multi=True)
https://stackoverflow.com/a/51809025/11691764
但官方示例内, 也是不带注释的连续 sql 语句
https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html
有什么好的解决办法吗?
除了先把 sql 文件处理一遍去掉注释外
1
dabaibai 2019-07-03 10:42:16 +08:00
调用 mysql 的 mysqldump 命令
或者找到 mysqldump 的代码 编个 python 接口. |
3
RockShake 2019-07-03 10:55:40 +08:00
关注一下,前两天的做法就是直接粗暴的删掉注释操作的
|
5
lolizeppelin 2019-07-03 11:11:39 +08:00
我搞过....最后别人给了思路不要正则
用写语法解析器的思路 入栈出栈 按规范处理 23333 水平不够写得超级难看 |
6
Vegetable 2019-07-03 11:13:08 +08:00
你说的是这个吗?我没理解你遇到了什么问题
可以的形式 In [7]: cursor.execute("select * from `test`") Out[7]: 35 In [8]: cursor.execute("select * #123 \n from `test`") Out[8]: 35 In [10]: cursor.execute("select * /*123*/ from `test`") Out[10]: 35 不行的 In [9]: cursor.execute("select * #123 from `访问详单`") |
7
firejoke OP @lolizeppelin #5 感觉渐渐变复杂了, 能看看你的代码吗?
|
8
firejoke OP @Vegetable #6 不是, 就是把 .sql 文件内的语句写到数据库, 一般这个文件内有各种换行, 转义符, 格式符, 以及注释
|
9
neutrino 2019-07-03 11:25:07 +08:00 via Android
调用命令行 mysql 呀
|
10
firejoke OP @neutrino #9 你是说这个吗?
import shlex from subprocess import Popen, PIPE # 这个并不会有效, 会命令解析错误, 即使加上 shell=True 也不行 res = Popen(shlex.split('mysql -uroot -padmin < test.sql'), stdout=PIPE, stderr=PIPE).communicate() # 也许你会想把 sql 文件作为输入 res = Popen(shlex.split('mysql -uroot -padmin') , stdout=PIPE, stderr=PIPE, stdin=PIPE).communicate(open('test.sql').read()) # 这样在遇到注释内的变量的时候会报错 |
11
lolizeppelin 2019-07-03 11:50:40 +08:00
|
12
wlh233 2019-07-03 13:36:56 +08:00
有现成的 sql 解析库啊,是需要这种东西吗
https://github.com/andialbrecht/sqlparse |
14
firejoke OP @lolizeppelin #11
@wlh233 #12 最后迫于赶时间 用了最暴力的 with open(src + 'sql.sh', 'w') as f: f.write('mysql -u{0} -p{1} -h {2} -P 3306 < {3}ve.sql'.format(db_user, db_password, db_host, src)) res = Popen(shlex.split('/usr/bin/sh ' + src + 'sql.sh'), stdout=PIPE, stderr=PIPE).communicate() os.remove(src + 'sql.sh') |