代码之家  ›  专栏  ›  技术社区  ›  Mark Jones

OSX El Capitan sqlalchemy无法连接到“127.0.0.1”上的MySQL服务器(111)

  •  1
  • Mark Jones  · 技术社区  · 7 年前

    我在通过python包sqlalchemy连接MySQL数据库时遇到问题。我得到以下错误。

    “127.0.0.1”(111)“上的服务器无无

    mysql -h 127.0.0.1 -u my_user --password='password' db -e "SHOW TABLES;"
    enter code here
    

      print config.get('repository', 'host') // 127.0.0.1
      print config.get('repository', 'user') // my_user
      print config.get('repository', 'passwd') // password
    

      engine = getUnaffiliatedEngine()
      print engine //Engine(mysql://my_user:***@127.0.0.1:3306)
      with engine.connect() as connection:
        for s in statements:
          if s.strip():
            connection.execute(s)
    

    也许mysql有不止一个版本在运行?只有一个进程正在运行:

    ps -ef | grep mysql
    

    mysql> select User, Host from mysql.user;
    
    +------+--------------------------+
    | User | Host                     |
    +------+--------------------------+
    |my_user 127.0.0.1                |
    | root | 127.0.0.1                |
    | root | ::1                      |
    |      | localhost                |
    | root | localhost                |
    +------+--------------------------+
    

    类似地,“显示数据库”显示数据库存在。我已经为每个数据库授予该用户所有权限。我也冲洗过厕所。

    我甚至不知道在这一点上还需要调试什么。下面是引发连接错误的python脚本的简化版本:

    DSN_FORMAT = "mysql://%(user)s:%(passwd)s@%(host)s:%(port)s"
    
    def getDSN():
      return DSN_FORMAT % dict(config.items("repository"))
    
    def getUnaffiliatedEngine():
      return create_engine(getDSN())
    
    def reset(offline=False):
      config.loadConfig()
      dbName = config.get('repository', 'db')
      print config.get('repository', 'host')
      print config.get('repository', 'user')
      print config.get('repository', 'passwd')
    
      resetDatabaseSQL = (
          "DROP DATABASE IF EXISTS %(database)s; "
          "CREATE DATABASE %(database)s;" % {"database": dbName})
      statements = resetDatabaseSQL.split(";")
    
      engine = getUnaffiliatedEngine()
      print engine
      with engine.connect() as connection:
        for s in statements:
          if s.strip():
            connection.execute(s)
    

    tcpdump -i lo0 port 3306 :

    11:44:41.224036 IP localhost.58797 > localhost.mysql: Flags [P.], seq 3915736486:3915736498, ack 2134634265, win 12519, options [nop,nop,TS val 980567261 ecr 980503692], length 12
    11:44:41.224105 IP localhost.mysql > localhost.58797: Flags [.], ack 12, win 12737, options [nop,nop,TS val 980567261 ecr 980567261], length 0
    11:44:41.224178 IP localhost.mysql > localhost.58797: Flags [P.], seq 1:19, ack 12, win 12737, options [nop,nop,TS val 980567261 ecr 980567261], length 18
    11:44:41.224218 IP localhost.58797 > localhost.mysql: Flags [.], ack 19, win 12519, options [nop,nop,TS val 980567261 ecr 980567261], length 0
    11:45:07.422776 IP localhost.58796 > localhost.mysql: Flags [P.], seq 2953728354:2953728366, ack 432872138, win 12483, options [nop,nop,TS val 980593366 ecr 980533534], length 12
    11:45:07.422807 IP localhost.mysql > localhost.58796: Flags [.], ack 12, win 12729, options [nop,nop,TS val 980593366 ecr 980593366], length 0
    11:45:07.422856 IP localhost.mysql > localhost.58796: Flags [P.], seq 1:19, ack 12, win 12729, options [nop,nop,TS val 980593366 ecr 980593366], length 18
    11:45:07.422877 IP localhost.58796 > localhost.mysql: Flags [.], ack 19, win 12482, options [nop,nop,TS val 980593366 ecr 980593366], length 0
    

    MySQL 5.6

    1 回复  |  直到 7 年前
        1
  •  1
  •   user1785721 user1785721    7 年前

    你写的最后一条评论很重要,可能是问题的原因。

    我很确定Docker容器有自己的环回接口,地址为127.0.0.1,与运行MySQL的OSX环回接口不同。

    我建议您将MySQL侦听放在从容器内部可见的地址上。您可以轻松调试该配置 telnet ip_address 3306 从容器内部。