sql >> Databáze >  >> RDS >> Mysql

Jak vzdáleně připojit databázi MySQL pomocí Python+SQLAlchemy?

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:[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',)]

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:[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',)]

Žádný port za názvem hostitele :toto je soket UNIX.



  1. SQLT a dělení

  2. Jak drahé jsou implicitní konverze na straně sloupců?

  3. Může dotaz MySQL změnit řádky na sloupce?

  4. Použití vzorů pracovních postupů ke správě stavu libovolné entity