Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menghubungkan database MySQL menggunakan Python+SQLAlchemy dari jarak jauh?

Jawaban klasik untuk masalah ini adalah dengan menggunakan 127.0.0.1 atau IP host atau nama host alih-alih "nama khusus" localhost . Dari dokumentasi :

Dan nanti:

Namun, trik sederhana ini tampaknya tidak berhasil dalam kasus Anda, jadi Anda entah bagaimana harus memaksa penggunaan soket TCP. Seperti yang Anda jelaskan sendiri, saat menjalankan mysql pada baris perintah, Anda menggunakan --protocol tcp pilihan.

Seperti yang dijelaskan di sini , dari SQLAlchemy, Anda dapat meneruskan opsi yang relevan (jika ada) ke driver Anda baik sebagai opsi URL atau menggunakan connect_args argumen kata kunci.

Misalnya menggunakan PyMySQL , pada sistem pengujian yang saya siapkan untuk tujuan itu (MariaDB 10.0.12, SQLAlchemy 0.9.8 dan PyMySQL 0.6.2) saya mendapatkan hasil berikut:

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

Seperti yang Anda perhatikan, keduanya akan menggunakan koneksi TCP (saya tahu itu karena nomor port setelah nama host). Sebaliknya:

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

Tidak ada port setelah hostname :ini adalah soket 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. Buat komentar untuk tampilan di mysql

  2. MySQL - Tidak dapat memasukkan nilai NULL di kolom, tetapi saya memiliki nilai default yang ditentukan?

  3. MySQL:Menemukan baris yang tidak mengambil bagian dalam suatu hubungan

  4. PostgreSQL setara dengan tabel memori MySQL?

  5. Saya ingin membuat halaman pencarian di mana saya ingin menampilkan data pencarian saya dari database dalam div?