Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak zdalnie połączyć bazę danych MySQL za pomocą Python+SQLAlchemy?

Klasyczną odpowiedzią na ten problem jest użycie 127.0.0.1 lub IP hosta lub nazwa hosta zamiast „specjalnej nazwy” localhost . Z dokumentacji :

A później:

Jednak ta prosta sztuczka wydaje się nie działać w Twoim przypadku, więc musisz jakoś wymusić użycie gniazda TCP. Jak sam to wyjaśniłeś, podczas wywoływania mysql w wierszu poleceń używasz --protocol tcp opcja.

Jak wyjaśniono tutaj , z SQLAlchemy możesz przekazać odpowiednie opcje (jeśli są) do swojego sterownika jako opcje adresu URL lub za pomocą connect_args argument słowa kluczowego.

Na przykład przy użyciu PyMySQL , w systemie testowym skonfigurowanym w tym celu (MariaDB 10.0.12, SQLAlchemy 0.9.8 i PyMySQL 0.6.2) uzyskałem następujące wyniki:

>>> 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 zauważyłeś, oba będą korzystać z połączenia TCP (wiem to z powodu numeru portu po nazwie hosta). Z drugiej strony:

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

Brak portu po nawie hosta :to jest gniazdo UNIX.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa funkcja SUBSTR() w MySQL

  2. Czy występuje spadek wydajności, jeśli w tabeli jest zbyt wiele kolumn?

  3. Jak mogę zrobić „wstaw, jeśli nie istnieje” w MySQL?

  4. Jak zoptymalizować wydajność MySQL za pomocą MySQLTuner

  5. Znaczenie backticku wokół nazwy tabeli w zapytaniu MySQL