【问题标题】:Can't get MySQL source query to work using Python mysqldb module无法使用 Python mysqldb 模块让 MySQL 源查询工作
【发布时间】:2010-12-28 06:52:08
【问题描述】:

我有以下几行代码:

sql = "source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql"
cursor.execute (sql)

当我执行我的程序时,我收到以下错误:

错误 1064:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'source C:\My Dropbox\workspace\projects\hosted_inv\create_site_db.sql' 附近使用正确的语法

现在我可以将以下内容复制并粘贴到 mysql 中作为查询:

source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql

而且效果很好。当我检查我的脚本执行的查询的查询日志时,它显示我的查询如下:

source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql

但是,当我手动将其粘贴并执行时,整个 create_site_db.sql 会在查询日志中展开,并显示该文件中的所有 sql 查询。

我在这里遗漏了一些关于 mysqldb 如何进行查询的内容吗?我是否遇到了限制。我的目标是运行一个 sql 脚本来创建架构结构,但我不想在 shell 进程中调用 mysql 来获取 sql 文件。

有什么想法吗?谢谢!

【问题讨论】:

    标签: python mysql scripting


    【解决方案1】:

    source 命令是仅由 mysql 命令行客户端识别的built-in commands 之一。不支持作为可以通过任何 API 执行的语句。

    有些人认为您可以简单地在“;”语句终止符上拆分一个 SQL 脚本文件,然后在获得的每一行上调用 execute()。但也有很多例外情况:

    • built-in commands 的语句如 CONNECTSOURCECHARSETWARNINGSQUIT 等。
    • 请注意,内置命令不需要以; 结尾,例如DELIMITER
    • 包含; 但不作为终止符的语句,例如CREATE TRIGGER
    • 在字符串文字或 cmets 甚至是带引号的标识符中包含 ; 的语句。
    • 评论行。

    要以编程方式加载 SQL 脚本,您必须复制 mysql 客户端的大量功能。因此,最好只派生一个进程,以脚本作为输入实际执行该客户端程序。

    另见:

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题!

      作为解决方案,我安装了库 sqlparse 并使用了 sqlparse.split( sql ) 结果。我必须检查 sql_parts 是否包含空行作为单独的语句......否则“WOW” sqlparse 非常棒,正是我所需要的!

      import sqlparse 
      ....
      sql = open("test.sql").read()
      sql_parts = sqlparse.split( sql )
      for sql_part in sql_parts:
          if sql_part.strip() ==  '':
              continue 
          cursor.execute( sql_part )
      

      仅供参考:如果您不单独运行每个语句,您可能会收到错误消息“命令不同步;您现在无法运行此命令”。我只是在向我的 sql 文件添加更多查询后才收到此错误 - 不是第一次。

      【讨论】:

      • 不是 sql_part.strip() 而不是替换位吗?
      • 是的,我想 strip 会更好,更便携(更新后)。
      【解决方案3】:

      我相信“source”命令特定于 mysql shell 可执行文件 - 它不是 sql 命令,当作为 sql 语句执行时无法正确解释。

      为了实现您的目标,您可能需要读取脚本文件并将其解析为单独的 sql 语句,然后用光标一次执行一条。

      【讨论】:

        【解决方案4】:

        正如其他人所说,您不能在 MySQLdb Python API 中使用命令source

        所以,不要运行它,而是加载文件并执行它

        假设你的 .sql 文件有

        create database test;
        

        阅读内容喜欢

        sql=open("test.sql").read()
        

        然后执行

        cursor.execute(sql);
        

        你会得到新的数据库“test”

        【讨论】:

        • 非常感谢! sql=open("test.sql").read() 完全符合我的要求。我想避免分叉一个 shell 进程,因为它不仅觉得没有必要,而且我会依赖安装在我执行的系统上的 mysql 客户端二进制文件。感谢大家的帮助!
        【解决方案5】:

        'source'不是SQL命令,而是mysql命令行客户端的内部命令。

        【讨论】:

          猜你喜欢
          • 2016-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-23
          • 2013-03-05
          • 1970-01-01
          • 2019-01-12
          相关资源
          最近更新 更多