sql >> Databasteknik >  >> RDS >> Mysql

Hur ansluter man MySQL-databas med Python+SQLAlchemy på distans?

Det klassiska svaret på det här problemet är att använda 127.0.0.1 eller värdens IP eller värdnamnet istället för det "speciella namnet" localhost . Från dokumentationen :

Och senare:

Det här enkla tricket verkar dock inte fungera i ditt fall, så du måste på något sätt tvinga användningen av ett TCP-uttag. Som du förklarade det själv, när du anropar mysql på kommandoraden använder du --protocol tcp alternativ.

Som förklarat här , från SQLAlchemy kan du skicka de relevanta alternativen (om några) till din drivrutin antingen som URL-alternativ eller med connect_args sökordsargument.

Till exempel med PyMySQL , på ett testsystem som jag har ställt in för det ändamålet (MariaDB 10.0.12, SQLAlchemy 0.9.8 och PyMySQL 0.6.2) fick jag följande resultat:

>>> 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 märkte kommer båda att använda en TCP-anslutning (jag vet det på grund av portnumret efter värdnamnet). Å andra sidan:

>>> 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ärdnamnet :detta är ett UNIX-uttag.



  1. Hur OBJECTPROPERTY() fungerar i SQL Server

  2. MySQL - explodera/dela ​​indata till lagrad procedur

  3. MySQL LOAD DATA INFILE butiksradnummer

  4. PHP:Om posten finns visa HTML, annars visas ingenting