V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
firejoke
V2EX  ›  Python

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

  •  
  •   firejoke · 2019-07-03 10:39:37 +08:00 · 4191 次点击
    这是一个创建于 2002 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    入栈出栈 按规范处理 23333

    水平不够写得超级难看
    Vegetable
        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 `访问详单`")
    firejoke
        7
    firejoke  
    OP
       2019-07-03 11:21:49 +08:00
    @lolizeppelin #5 感觉渐渐变复杂了, 能看看你的代码吗?
    firejoke
        8
    firejoke  
    OP
       2019-07-03 11:23:46 +08:00
    @Vegetable #6 不是, 就是把 .sql 文件内的语句写到数据库, 一般这个文件内有各种换行, 转义符, 格式符, 以及注释
    neutrino
        9
    neutrino  
       2019-07-03 11:25:07 +08:00 via Android
    调用命令行 mysql 呀
    firejoke
        10
    firejoke  
    OP
       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
        11
    lolizeppelin  
       2019-07-03 11:50:40 +08:00
    wlh233
        12
    wlh233  
       2019-07-03 13:36:56 +08:00
    有现成的 sql 解析库啊,是需要这种东西吗
    https://github.com/andialbrecht/sqlparse
    firejoke
        13
    firejoke  
    OP
       2019-07-03 16:44:38 +08:00
    @wlh233 #12 在试你这个, 有中文解码问题, 有结果了再告诉你
    firejoke
        14
    firejoke  
    OP
       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')
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3463 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 04:46 · PVG 12:46 · LAX 20:46 · JFK 23:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.