【问题标题】:Executing several SQL queries with MySQLdb使用 MySQLdb 执行多个 SQL 查询
【发布时间】:2011-06-04 15:44:50
【问题描述】:

你将如何使用 python 执行多个 SQL 语句(脚本模式)?

尝试做这样的事情:

import MySQLdb
mysql = MySQLdb.connect(host='host...rds.amazonaws.com', db='dbName', user='userName', passwd='password')
sql = """
insert into rollout.version (`key`, `value`) VALUES ('maxim0', 'was here0');
insert into rollout.version (`key`, `value`) VALUES ('maxim1', 'was here1');
insert into rollout.version (`key`, `value`) VALUES ('maxim2', 'was here1');
"""
mysql.query(sql)

失败:

ProgrammingError: (2014, "Commands out 同步的;你不能运行这个命令 现在”)

我正在编写一个部署引擎,它可以接受来自几个人的 SQL 增量更改,并将它们应用于版本部署的数据库。

我查看了这段代码 http://sujitpal.blogspot.com/2009/02/python-sql-runner.html 并实现了 __sanitize_sql:

def __sanitize_sql(sql):
    # Initial implementation from http://sujitpal.blogspot.com/2009/02/python-sql-runner.html
    sql_statements = []

    incomment = False
    in_sqlcollect = False

    sql_statement = None
    for sline in sql.splitlines():
        # Remove white space from both sides.
        sline = sline.strip()

        if sline.startswith("--") or len(sline) == 0:
            # SQL Comment line, skip
            continue

        if sline.startswith("/*"):
            # start of SQL comment block
            incomment = True
        if incomment and sline.endswith("*/"):
            # end of SQL comment block
            incomment = False
            continue

        # Collect line which is part of 
        if not incomment:
            if sql_statement is None:
                sql_statement = sline
            else:
                sql_statement += sline

            if not sline.endswith(";"):
                in_sqlcollect = True

            if not in_sqlcollect:
                sql_statements.append(sql_statement)
                sql_statement = None
                in_sqlcollect = False

    if not incomment and not sql_statement is None and len(sql_statement) != 0:
        sql_statements.append(sql_statement)

    return sql_statements

if __name__ == "__main__":
    sql = sql = """update tbl1;
/* This
is my
beautiful 
comment*/
/*this is comment #2*/
some code...;
-- comment
sql code
"""
    print __sanitize_sql(sql)

不知道这是否是最好的解决方案,但似乎对解析 SQL 语句不太复杂。

现在的问题是如何运行此代码,我可以执行this dude 之类的操作,但它看起来很难看,我不是 python 专家(过去两周我们一直在这里做 python)但看起来以这种方式滥用光标是 hackish 而不是一个好习惯。

想法/博客文章会有所帮助。

谢谢你,
马克西姆。

【问题讨论】:

    标签: python sql batch-processing sql-scripts


    【解决方案1】:

    这里是你如何使用executemany()

    import MySQLdb
    connection = MySQLdb.connect(host='host...rds.amazonaws.com', db='dbName', user='userName', passwd='password')
    cursor = connection.cursor()
    
    my_data_to_insert = [['maxim0', 'was here0'], ['maxim1', 'was here1'], ['maxim2', 'was here1']]
    sql = "insert into rollout.version (`key`, `value`) VALUES (%s, %s);"
    
    cursor.executemany(sql, my_data_to_insert)
    
    connection.commit()
    connection.close()
    

    【讨论】:

      【解决方案2】:

      在游标对象上调用 executemany 方法。更多信息在这里: http://mysql-python.sourceforge.net/MySQLdb.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-09
        • 2016-05-31
        • 2014-08-09
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        • 1970-01-01
        相关资源
        最近更新 更多