如何在 Python 下读取带注释的 sql 文件, 并写入数据库?

2019-07-03 10:39:37 +08:00
 firejoke

有一个 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 文件处理一遍去掉注释外

4160 次点击
所在节点    Python
14 条回复
dabaibai
2019-07-03 10:42:16 +08:00
调用 mysql 的 mysqldump 命令
或者找到 mysqldump 的代码 编个 python 接口.
firejoke
2019-07-03 10:48:18 +08:00
@dabaibai #1 是哦, 我去看看 pyMSQL 的源码
RockShake
2019-07-03 10:55:40 +08:00
关注一下,前两天的做法就是直接粗暴的删掉注释操作的
firejoke
2019-07-03 10:56:58 +08:00
@RockShake #3 但从数据库导出的 sql 里面不是很多注释是带变量的吗
lolizeppelin
2019-07-03 11:11:39 +08:00
我搞过....最后别人给了思路不要正则
用写语法解析器的思路

入栈出栈 按规范处理 23333

水平不够写得超级难看
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 `访问详单`")
firejoke
2019-07-03 11:21:49 +08:00
@lolizeppelin #5 感觉渐渐变复杂了, 能看看你的代码吗?
firejoke
2019-07-03 11:23:46 +08:00
@Vegetable #6 不是, 就是把 .sql 文件内的语句写到数据库, 一般这个文件内有各种换行, 转义符, 格式符, 以及注释
neutrino
2019-07-03 11:25:07 +08:00
调用命令行 mysql 呀
firejoke
2019-07-03 11:31:55 +08:00
@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())
# 这样在遇到注释内的变量的时候会报错
lolizeppelin
2019-07-03 11:50:40 +08:00
wlh233
2019-07-03 13:36:56 +08:00
有现成的 sql 解析库啊,是需要这种东西吗
https://github.com/andialbrecht/sqlparse
firejoke
2019-07-03 16:44:38 +08:00
@wlh233 #12 在试你这个, 有中文解码问题, 有结果了再告诉你
firejoke
2019-08-07 17:39:11 +08:00
@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')

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/579536

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX