Klasickou odpovědí na tento problém je použití 127.0.0.1 nebo IP hostitele nebo název hostitele místo "speciálního jména" localhost . Z dokumentace
:
A později:
Zdá se však, že tento jednoduchý trik ve vašem případě nefunguje, takže jej musíte nějak donutit použití TCP socketu. Jak jste to sám vysvětlil, při vyvolání mysql na příkazovém řádku použijete --protocol tcp možnost.
Jak je vysvětleno zde
, z SQLAlchemy, můžete příslušné možnosti (pokud existují) předat svému ovladači buď jako možnosti adresy URL nebo pomocí connect_args argument klíčového slova.
Například pomocí PyMySQL , na testovacím systému, který jsem pro tento účel nastavil (MariaDB 10.0.12, SQLAlchemy 0.9.8 a PyMySQL 0.6.2), jsem získal následující výsledky:
>>> engine = create_engine(
"mysql+pymysql://sylvain:example@sqldat.com/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:example@sqldat.com/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:example@sqldat.com/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',)]
Jak jste si všimli, oba budou používat připojení TCP (vím to kvůli číslu portu za názvem hostitele). Na druhou stranu:
>>> engine = create_engine(
"mysql+pymysql://sylvain:example@sqldat.com/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:example@sqldat.com/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:example@sqldat.com/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',)]
Žádný port za názvem hostitele :toto je soket UNIX.