首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

  •  
  •   firejoke · 134 天前 · 1661 次点击
    这是一个创建于 134 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个 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
        1
    dabaibai   134 天前
    调用 mysql 的 mysqldump 命令
    或者找到 mysqldump 的代码 编个 python 接口.
        2
    firejoke   134 天前
    @dabaibai #1 是哦, 我去看看 pyMSQL 的源码
        3
    RockShake   134 天前
    关注一下,前两天的做法就是直接粗暴的删掉注释操作的
        4
    firejoke   134 天前
    @RockShake #3 但从数据库导出的 sql 里面不是很多注释是带变量的吗
        5
    lolizeppelin   134 天前
    我搞过....最后别人给了思路不要正则
    用写语法解析器的思路

    入栈出栈 按规范处理 23333

    水平不够写得超级难看
        6
    Vegetable   134 天前
    你说的是这个吗?我没理解你遇到了什么问题
    可以的形式
    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   134 天前
    @lolizeppelin #5 感觉渐渐变复杂了, 能看看你的代码吗?
        8
    firejoke   134 天前
    @Vegetable #6 不是, 就是把 .sql 文件内的语句写到数据库, 一般这个文件内有各种换行, 转义符, 格式符, 以及注释
        9
    neutrino   134 天前 via Android
    调用命令行 mysql 呀
        10
    firejoke   134 天前
    @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   134 天前
        12
    wlh233   134 天前
    有现成的 sql 解析库啊,是需要这种东西吗
    https://github.com/andialbrecht/sqlparse
        13
    firejoke   134 天前
    @wlh233 #12 在试你这个, 有中文解码问题, 有结果了再告诉你
        14
    firejoke   99 天前
    @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')
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2756 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 31ms · UTC 12:05 · PVG 20:05 · LAX 04:05 · JFK 07:05
    ♥ Do have faith in what you're doing.