Jawaban klasik untuk masalah ini adalah dengan menggunakan 127.0.0.1
atau IP host atau nama host alih-alih "nama khusus" localhost
. Dari dokumentasi
:
Dan nanti:
Namun, trik sederhana ini tampaknya tidak berhasil dalam kasus Anda, jadi Anda entah bagaimana harus memaksa penggunaan soket TCP. Seperti yang Anda jelaskan sendiri, saat menjalankan mysql
pada baris perintah, Anda menggunakan --protocol tcp
pilihan.
Seperti yang dijelaskan di sini
, dari SQLAlchemy, Anda dapat meneruskan opsi yang relevan (jika ada) ke driver Anda baik sebagai opsi URL atau menggunakan connect_args
argumen kata kunci.
Misalnya menggunakan PyMySQL , pada sistem pengujian yang saya siapkan untuk tujuan itu (MariaDB 10.0.12, SQLAlchemy 0.9.8 dan PyMySQL 0.6.2) saya mendapatkan hasil berikut:
>>> 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',)]
Seperti yang Anda perhatikan, keduanya akan menggunakan koneksi TCP (saya tahu itu karena nomor port setelah nama host). Sebaliknya:
>>> 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',)]
Tidak ada port setelah hostname :ini adalah soket UNIX.