今天用python 写了一个获取mysql库表信息的工具,在连接mysql数据库时,代码如下

#!/usr/bin/env  python
# --*--coding:utf-8 --*--


import pymysql
import socket

class MySqlModule:

    _url = ""
    _port = 0
    _username=""
    _password=""
    _db=""
    _table=""
    _connectCursor = None

    # host=None, user=None, password="",
    # database=None, port=0, unix_socket=None,
    # charset='', sql_mode=None,
    # read_default_file=None, conv=None, use_unicode=None,
    # client_flag=0, cursorclass=Cursor, init_command=None,
    # connect_timeout=10, ssl=None, read_default_group=None,
    # compress=None, named_pipe=None,
    # autocommit=False, db=None, passwd=None, local_infile=False,
    # max_allowed_packet=16*1024*1024, defer_connect=False,
    # auth_plugin_map=None, read_timeout=None, write_timeout=None,
    # bind_address=None, binary_prefix=False, program_name=None,
    # server_public_key=None

    def __init__(self,url,port,database,username,password,tbl):
        self._url = url
        self._port = int(port)
        self._db = database
        self._username = username
        self._password = password
        self._table = tbl

    def connectCursor(self):
        self._connectCursor = pymysql.connect(self._url,self._db
                                        ,self._username
                                        ,self._password
                                        ,self._port
                                        ,charset='utf8').cursor()
    def getTableFrame(self):
        if self._connectCursor == None:
            self.connectCursor()
        sql = "show create table {0}.{1}".format(self._db
                                                 ,self._table)
        self._connectCursor.execute(sql)
        tableInfo = self._connectCursor.fetchone()
        while tableInfo != None :
            print(tableInfo)
            tableInfo = self._connectCursor.fetchone()




def main():

    url = "hadoop-master-01"
    port = 3306
    db = "test"
    username = "root"
    password = "xxxxxx"
    table = "t1"
    print(ip)

    connect = MySqlModule(url,port,db,username,password,table)
    connect.getTableFrame()


if __name__ == "__main__":
    main()

报错,信息如下:

Can't connect to MySQL server on 'hadoop-master-01' ([Errno 8] nodename nor servname provided, or not known

Traceback (most recent call last):
  File "/Users/huangshengbiao/IdeaProjects/MyDemoFlink/SqoopPythonModel/com/huang/utils/MySqlModule.py", line 83, in <module>
    main()
  File "/Users/huangshengbiao/IdeaProjects/MyDemoFlink/SqoopPythonModel/com/huang/utils/MySqlModule.py", line 79, in main
    connect.getTableFrame()
  File "/Users/huangshengbiao/IdeaProjects/MyDemoFlink/SqoopPythonModel/com/huang/utils/MySqlModule.py", line 55, in getTableFrame
    self.connectCursor()
  File "/Users/huangshengbiao/IdeaProjects/MyDemoFlink/SqoopPythonModel/com/huang/utils/MySqlModule.py", line 52, in connectCursor
    ,charset='utf8').cursor()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pymysql/__init__.py", line 94, in Connect
    return Connection(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pymysql/connections.py", line 325, in __init__
    self.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pymysql/connections.py", line 630, in connect
    raise exc
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'hadoop-master-01' ([Errno 8] nodename nor servname provided, or not known)")

这个问题,一开始没有注意,上了度娘,找答案

很多说是  /etc/hosts 的问题

我做过了如下测试

1、直接 ping hadoop-master-01,结果如下,没有问题

PING hadoop-master-01 (192.168.181.209): 56 data bytes
64 bytes from 192.168.181.209: icmp_seq=0 ttl=64 time=0.423 ms
64 bytes from 192.168.181.209: icmp_seq=1 ttl=64 time=0.584 ms
64 bytes from 192.168.181.209: icmp_seq=2 ttl=64 time=0.521 ms
64 bytes from 192.168.181.209: icmp_seq=3 ttl=64 time=0.425 ms
64 bytes from 192.168.181.209: icmp_seq=4 ttl=64 time=0.498 ms
64 bytes from 192.168.181.209: icmp_seq=5 ttl=64 time=0.502 ms
64 bytes from 192.168.181.209: icmp_seq=6 ttl=64 time=0.504 ms
64 bytes from 192.168.181.209: icmp_seq=7 ttl=64 time=0.473 ms
64 bytes from 192.168.181.209: icmp_seq=8 ttl=64 time=0.410 ms

2、telnet hadoop-master-01,如果如下:没有问题

xxxx@hadoop-master-01:~$ telnet hadoop-master-01 3306
Trying 192.168.181.209...
Connected to hadoop-master-01.
Escape character is '^]'.
J
5.6.43?l-7oH[o?/jLx:X,rx&P@mysql_native_password

通过如上测试,发现不是/etc/hosts的配置问题

3、最后直接跟踪调试

在 connections.py 的 __init__方法,

到这里为止,可以这断定,是我的会传参位置顺序不对,调整顺序

#!/usr/bin/env  python
# --*--coding:utf-8 --*--

import socket

class MySqlModule:

    _url = ""
    _port = 0
    _username=""
    _password=""
    _db=""
    _table=""
    _connectCursor = None

    # host=None, user=None, password="",
    # database=None, port=0, unix_socket=None,
    # charset='', sql_mode=None,
    # read_default_file=None, conv=None, use_unicode=None,
    # client_flag=0, cursorclass=Cursor, init_command=None,
    # connect_timeout=10, ssl=None, read_default_group=None,
    # compress=None, named_pipe=None,
    # autocommit=False, db=None, passwd=None, local_infile=False,
    # max_allowed_packet=16*1024*1024, defer_connect=False,
    # auth_plugin_map=None, read_timeout=None, write_timeout=None,
    # bind_address=None, binary_prefix=False, program_name=None,
    # server_public_key=None

    def __init__(self,url,port,database,username,password,tbl):
        self._url = url
        self._port = int(port)
        self._db = database
        self._username = username
        self._password = password
        self._table = tbl

    def connectCursor(self):
        self._connectCursor = pymysql.connect(self._url
                                        ,self._username
                                        ,self._password
                                        ,self._db
                                        ,self._port
                                        ,charset='utf8').cursor()
    def getTableFrame(self):
        if self._connectCursor == None:
            self.connectCursor()
        sql = "show create table {0}.{1}".format(self._db
                                                 ,self._table)
        self._connectCursor.execute(sql)
        tableInfo = self._connectCursor.fetchone()
        while tableInfo != None :
            print(tableInfo)
            tableInfo = self._connectCursor.fetchone()




def main():

    url = "hadoop-master-01"
    port = 3306
    db = "test"
    username = "root"
    password = "xxxx"
    table = "t1"
    ip = socket.gethostbyname(url)
    print(ip)

    connect = MySqlModule(url,port,db,username,password,table)
    connect.getTableFrame()


if __name__ == "__main__":
    main()

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐