sql >> Database teknologi >  >> RDS >> Mysql

Hvordan forbinder man MySQL-database ved hjælp af Python+SQLAlchemy eksternt?

Det klassiske svar på dette problem er at bruge 127.0.0.1 eller værtens IP eller værtsnavnet i stedet for det "særlige navn" localhost . Fra dokumentationen :

Og senere:

Dette simple trick ser dog ikke ud til at virke i dit tilfælde, så du skal på en eller anden måde tvinge brugen af ​​et TCP-stik. Som du selv forklarede det, når du kalder mysql på kommandolinjen bruger du --protocol tcp mulighed.

Som forklaret her , fra SQLAlchemy, kan du videregive de relevante muligheder (hvis nogen) til din driver enten som URL-indstillinger eller ved hjælp af connect_args søgeordsargument.

For eksempel ved at bruge PyMySQL , på et testsystem, jeg har konfigureret til det formål (MariaDB 10.0.12, SQLAlchemy 0.9.8 og PyMySQL 0.6.2) fik jeg følgende resultater:

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

Som du har bemærket, vil begge bruge en TCP-forbindelse (det ved jeg på grund af portnummeret efter værtsnavnet). På den anden side:

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

Ingen port efter værtsnavnet :dette er en UNIX-sokkel.



  1. MYSQL - Sådan omgås rækkestørrelsesgrænsen på 66 KBytes

  2. Hvad er den mest ligetil måde at udfylde tomme datoer i SQL-resultater (i enten mysql- eller perl-enden)?

  3. Tilslutning af IRI-software til Oracle

  4. Gem php datetime i mysql-databasen