1. ホーム
  2. マイスル

MySQLとのPython統合でAttributeErrorが発生する: モジュール 'socket' には 'AF_UNIX' という属性がない

2022-01-24 14:26:17

ランタイム環境

1. pycharm3.6

2. MySQL 8.0.12

まず、本の通りにコードを入力します(実際のところ123456が私のパスワードです)。

import pymysql
conn = pymysql.connect(host='127.0.0.1', unix_socket='/tmp/mysql.sock',user='root',
                       passwd='123456', db='mysql')
cur = conn.cursor()
cur.execute("USE scraping")

cur.execute("SELECT * FROM pages WHERE id=1")
print(cur.fetchone())
cur.close()
conn.close()


結果を実行します。

Traceback (most recent call last):
  File "D:/wangyi/MySQL.py", line 3, in <module>
    passwd='123456', db='mysql')
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymysql__\init__.py", line 94, in Connect
    return Connection(*args, **kwargs)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymysql\connections.py", line 327, in __init__
    self.connect()
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pymysql\connections.py", line 568, in connect
    sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
AttributeError: module 'socket' has no attribute 'AF_UNIX'

Process finished with exit code 1

ドキュメントを確認した結果、エラーコードは

unix_socket='/tmp/mysql.sock'です。

このunix_socketというコードはソケット接続の場合のみ使用され、ここではIP接続を使用しているので unix_socket='/tmp/mysql.sock'を指定します。 になります。

ポート=3306 それは mysqlのデフォルトポート番号 3306 .

コードを以下のように変更しました。

import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root',
                       passwd='123456', db='mysql')
cur = conn.cursor()
cur.execute("USE scraping")

cur.execute("SELECT * FROM pages WHERE id=1")
print(cur.fetchone())
cur.close()
conn.close()


結果を実行します。

(1, 'Test page title', 'This is some te\nst page content. It can be up to 10,000 characters long.', datetime.datetime(2018, 9, 13, 15, 55, 7))

Process finished with exit code 0


問題解決しました。

また host=127.0.0.1について

Windowsなどでの127.0.0.1の正しい解釈は、ローカルアドレス(ローカルサーバー)、127.0.0.1はNICを介して伝送され、NICに依存し、ネットワークファイアウォールとNIC関連の制限に従う。127.0.0.1はリターンアドレスで、ローカルマシンを指し、一般にテスト目的で使用されます。リターンアドレスは、ローカルリターンアドレス(ループバックアドレス)で、ホストIPスタック内のIPアドレスを指し、主にネットワークソフトウェアのテストやローカルマシン間のプロセス間通信に使用される。どのようなプログラムであっても、一度リターン・アドレスを使ってデータを送信すると、ネットワーク通信を行わずにすぐにプロトコル・ソフトウェアが戻ってくる。