Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để kết nối cơ sở dữ liệu MySQL bằng Python + SQLAlchemy từ xa?

Câu trả lời cổ điển cho vấn đề này là sử dụng 127.0.0.1 hoặc IP của máy chủ lưu trữ hoặc tên máy chủ thay vì "tên đặc biệt" localhost . Từ tài liệu :

Và sau này:

Tuy nhiên, thủ thuật đơn giản này dường như không hoạt động trong trường hợp của bạn, vì vậy bạn phải bằng cách nào đó buộc việc sử dụng ổ cắm TCP. Như bạn đã tự giải thích, khi gọi mysql trên dòng lệnh, bạn sử dụng --protocol tcp tùy chọn.

Như đã giải thích đây , từ SQLAlchemy, bạn có thể chuyển các tùy chọn liên quan (nếu có) cho trình điều khiển của mình dưới dạng tùy chọn URL hoặc sử dụng connect_args đối số từ khóa.

Ví dụ:sử dụng PyMySQL , trên một hệ thống thử nghiệm mà tôi đã thiết lập cho mục đích đó (MariaDB 10.0.12, SQLAlchemy 0.9.8 và PyMySQL 0.6.2), tôi nhận được kết quả sau:

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

Như bạn đã nhận thấy, cả hai sẽ sử dụng kết nối TCP (tôi biết điều đó vì số cổng sau tên máy chủ). Mặt khác:

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

Không có cổng nào sau tên máy chủ :đây là ổ cắm 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 có thể thay thế nhiều ký tự không?

  2. Chọn tất cả các điểm không gian địa lý bên trong một hộp giới hạn

  3. MySQL DATETIME - Chỉ thay đổi ngày

  4. PHP:Động thả xuống với optgroup

  5. Làm cách nào để thoát% khỏi truy vấn mysql python