【问题标题】:"pymysql.err.InternalError: (1046, u'No database selected')" error message when running Python script from command line“pymysql.err.InternalError: (1046, u'No database selected')” 从命令行运行 Python 脚本时出现错误消息
【发布时间】:2020-04-07 06:34:42
【问题描述】:

我正在尝试运行一个通过 PyMySQL 连接到 MySQL 数据库的 Python 脚本。该脚本实际上是:

import pymysql
cnx = pymysql.connect(read_default_file = "/directory/my.cnf", cursorclass = pymysql.cursors.DictCursor)
cursor = cnx.cursor()
# Do stuff.

当我在解释器中运行脚本时,我没有收到任何错误,但是当我尝试从命令行运行它时,我收到以下错误:

Traceback (most recent call last):
  File "s02_prepare_data_RNN.py", line 264, in <module>
    (omniture, urls, years, global_regions) = get_omniture_data("omniture_results")
  File "s02_prepare_data_RNN.py", line 76, in get_omniture_data
    sso_to_accountid = get_sso_accountids()
  File "s02_prepare_data_RNN.py", line 31, in get_sso_accountids
    cursor.execute(query)
  File "/home/rdu/malcorn/.local/lib/python2.6/site-packages/pymysql/cursors.py", line 134, in execute
    result = self._query(query)
  File "/home/rdu/malcorn/.local/lib/python2.6/site-packages/pymysql/cursors.py", line 282, in _query
    conn.query(q)
  File "/home/rdu/malcorn/.local/lib/python2.6/site-packages/pymysql/connections.py", line 768, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "/home/rdu/malcorn/.local/lib/python2.6/site-packages/pymysql/connections.py", line 929, in _read_query_result
    result.read()
  File "/home/rdu/malcorn/.local/lib/python2.6/site-packages/pymysql/connections.py", line 1125, in read
    first_packet = self.connection._read_packet()
  File "/home/rdu/malcorn/.local/lib/python2.6/site-packages/pymysql/connections.py", line 893, in _read_packet
    packet.check_error()
  File "/home/rdu/malcorn/.local/lib/python2.6/site-packages/pymysql/connections.py", line 369, in check_error
    err.raise_mysql_exception(self._data)
  File "/home/rdu/malcorn/.local/lib/python2.6/site-packages/pymysql/err.py", line 120, in raise_mysql_exception
    _check_mysql_exception(errinfo)
  File "/home/rdu/malcorn/.local/lib/python2.6/site-packages/pymysql/err.py", line 115, in _check_mysql_exception
    raise InternalError(errno, errorvalue)
pymysql.err.InternalError: (1046, u'No database selected')

【问题讨论】:

    标签: pymysql


    【解决方案1】:

    修改我的代码:

    import pymysql
    cnx = pymysql.connect(read_default_file = "/directory/my.cnf", cursorclass = pymysql.cursors.DictCursor)
    cursor = cnx.cursor()
    # Do stuff.
    

    到:

    import pymysql
    cnx = pymysql.connect(read_default_file = "/directory/my.cnf", cursorclass = pymysql.cursors.DictCursor)
    cursor = cnx.cursor()
    if __name__ == "__main__":
        # Do stuff.
    

    修复了错误。我认为 Python 可能会在建立连接之前尝试执行查询,所以我尝试将程序的主要部分放在 if __name__ == "__main__": 下并修复它。不过,我仍然不是 100% 发生了什么。我曾假设代码会等待连接建立,然后再继续执行以下几行,但此修复表明情况并非如此。

    还值得注意的是,我只是在具有 Python 2.6 的服务器上从命令行运行原始脚本时才收到错误消息。当我在装有 Python 2.7 的本地计算机上从命令行运行原始脚本时,我没有收到错误消息。

    不管怎样,if __name__ == "__main__": 是很好的 Python 风格,所以我以后一定会使用它。

    【讨论】:

      【解决方案2】:

      有时,当数据库 URI 构建不正确时,可能会发生这种情况。对我来说,当我的 pymysql 连接字符串(URL)如下所示时发生错误:

      mysql+pymysql://:@localhost/

      要修复它,它需要看起来像:

      mysql+pymysql://&lt;my-database-user-name&gt;:@localhost/&lt;my-database-name&gt; # 或将localhost 替换为您的特定主机名

      【讨论】:

        【解决方案3】:

        如果不选择连接的数据库,则必须添加此行。

        connection = pymysql.connect(host=DB_host, user=DB_user, password=DB_password)  # NO DB_NAME SPECIFED
        cursor = connection.cursor()
        cursor.execute(f'CREATE DATABASE IF NOT EXISTS {DB_NAME}')  # ADD THIS LINE!
        connection.select_db(DB_NAME)
        

        【讨论】:

          猜你喜欢
          • 2020-02-03
          • 1970-01-01
          • 2023-03-21
          • 2021-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多