Câu trả lời cổ điển cho vấn đề này là sử dụng 127.0.0.1
hoặc IP của máy chủ lưu trữ hoặc tên máy chủ thay vì "tên đặc biệt" localhost
. Từ tài liệu
:
Và sau này:
Tuy nhiên, thủ thuật đơn giản này dường như không hoạt động trong trường hợp của bạn, vì vậy bạn phải bằng cách nào đó buộc việc sử dụng ổ cắm TCP. Như bạn đã tự giải thích, khi gọi mysql
trên dòng lệnh, bạn sử dụng --protocol tcp
tùy chọn.
Như đã giải thích đây
, từ SQLAlchemy, bạn có thể chuyển các tùy chọn liên quan (nếu có) cho trình điều khiển của mình dưới dạng tùy chọn URL hoặc sử dụng connect_args
đối số từ khóa.
Ví dụ:sử dụng PyMySQL , trên một hệ thống thử nghiệm mà tôi đã thiết lập cho mục đích đó (MariaDB 10.0.12, SQLAlchemy 0.9.8 và PyMySQL 0.6.2), tôi nhận được kết quả sau:
>>> engine = create_engine(
"mysql+pymysql://sylvain:[email protected]/db?host=localhost?port=3306")
# ^^^^^^^^^^^^^^^^^^^^^^^^^^
# Force TCP socket. Notice the two uses of `?`
# Normally URL options should use `?` and `&`
# after that. But that doesn't work here (bug?)
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost:54164',)]
# Same result by using 127.0.0.1 instead of localhost:
>>> engine = create_engine(
"mysql+pymysql://sylvain:[email protected]/db?host=localhost?port=3306")
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost:54164',)]
# Alternatively, using connect_args:
>>> engine = create_engine("mysql+pymysql://sylvain:[email protected]/db",
connect_args= dict(host='localhost', port=3306))
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost:54353',)]
Như bạn đã nhận thấy, cả hai sẽ sử dụng kết nối TCP (tôi biết điều đó vì số cổng sau tên máy chủ). Mặt khác:
>>> engine = create_engine(
"mysql+pymysql://sylvain:[email protected]/db?unix_socket=/path/to/mysql.sock")
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# Specify the path to mysql.sock in
# the `unix_socket` option will force
# usage of a UNIX socket
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost',)]
# Same result by using 127.0.0.1 instead of localhost:
>>> engine = create_engine(
"mysql+pymysql://sylvain:[email protected]/db?unix_socket=/path/to/mysql.sock")
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost',)]
# Alternatively, using connect_args:
>>> engine = create_engine("mysql+pymysql://sylvain:[email protected]/db",
connect_args= dict(unix_socket="/path/to/mysql.sock"))
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost',)]
Không có cổng nào sau tên máy chủ :đây là ổ cắm UNIX.