sql >> Database >  >> RDS >> Mysql

Hoe MySQL-database op afstand verbinden met Python+SQLAlchemy?

Het klassieke antwoord op dit probleem is het gebruik van 127.0.0.1 of het IP van de host of de hostnaam in plaats van de "speciale naam" localhost . Uit de documentatie :

En later:

Deze simpele truc lijkt in jouw geval echter niet te werken, dus je moet op de een of andere manier forceren het gebruik van een TCP-socket. Zoals je het zelf hebt uitgelegd, bij het aanroepen van mysql op de opdrachtregel gebruikt u de --protocol tcp optie.

Zoals uitgelegd hier , van SQLAlchemy, kunt u de relevante opties (indien aanwezig) aan uw stuurprogramma doorgeven, hetzij als URL-opties of met behulp van de connect_args zoekwoordargument.

Bijvoorbeeld met behulp van PyMySQL , op een testsysteem dat ik voor dat doel heb ingesteld (MariaDB 10.0.12, SQLAlchemy 0.9.8 en PyMySQL 0.6.2) kreeg ik de volgende resultaten:

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

Zoals je hebt opgemerkt, zullen beide een TCP-verbinding gebruiken (ik weet dat vanwege het poortnummer achter de hostnaam). Aan de andere kant:

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

Geen poort na de hostnaam :dit is een UNIX-socket.



  1. MySQL LIMIT op DELETE-instructie

  2. Hoe SHOWPLAN_XML werkt in SQL Server

  3. MySql mysql.h-bestand niet gevonden in VS2008 C++ <Beginnersvraag>

  4. Postgres-fout bij invoegen - ERROR:ongeldige bytereeks voor codering van UTF8:0x00