इस मुद्दे का क्लासिक उत्तर 127.0.0.1
. का उपयोग करना है या होस्ट का आईपी या होस्ट नाम "विशेष नाम" के बजाय localhost
. दस्तावेज़ीकरण
से :
और बाद में:
हालाँकि, यह सरल तरकीब आपके मामले में काम नहीं करती है, इसलिए आपको किसी तरह बल टीसीपी सॉकेट का उपयोग। जैसा कि आपने स्वयं समझाया, mysql
. का आह्वान करते समय कमांड लाइन पर, आप --protocol tcp
. का उपयोग करते हैं विकल्प।
जैसा बताया गया है यहां
, SQLAlchemy से, आप अपने ड्राइवर को प्रासंगिक विकल्प (यदि कोई हों) या तो URL विकल्प या के रूप में पास कर सकते हैं connect_args
. का उपयोग करके कीवर्ड तर्क।
उदाहरण के लिए PyMySQL . का उपयोग करना , एक परीक्षण प्रणाली पर मैंने उस उद्देश्य के लिए सेटअप किया है (MariaDB 10.0.12, SQLAlchemy 0.9.8 और PyMySQL 0.6.2) मुझे निम्नलिखित परिणाम मिले:
>>> 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',)]
जैसा कि आपने देखा, दोनों एक टीसीपी कनेक्शन का उपयोग करेंगे (मुझे पता है कि होस्टनाम के बाद पोर्ट नंबर की वजह से)। दूसरी ओर:
>>> 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',)]
होस्टनाम . के बाद कोई पोर्ट नहीं :यह एक यूनिक्स सॉकेट है।