Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да свържа база данни MySQL с помощта на Python+SQLAlchemy от разстояние?

Класическият отговор на този проблем е да използвате 127.0.0.1 или IP на хоста или името на хост вместо "специалното име" localhost . От документацията :

И по-късно:

Изглежда обаче, че този прост трик не работи във вашия случай, така че трябва по някакъв начин да насилите използването на TCP сокет. Както го обяснихте сами, при извикване на 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',)]

Както забелязахте, и двете ще използват TCP връзка (знам това поради номера на порта след името на хоста). От друга страна:

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

Няма порт след име на хост :това е 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. Класирайте потребителите в mysql по техните точки

  2. MySQL премахва всички индекси от таблицата

  3. Mysql:Задайте набор от знаци за колони

  4. php while променлива за всеки трети div

  5. Точното значение на клаузата за външния ключ на MySQL „при ограничение за изтриване“.