programing

Python+를 사용하여 MySQL 데이터베이스를 연결하는 방법원격으로 SQL Lchemy?

telecom 2023. 10. 27. 21:44
반응형

Python+를 사용하여 MySQL 데이터베이스를 연결하는 방법원격으로 SQL Lchemy?

원격으로 MySQL에 접속하는 데 어려움을 겪고 있습니다.SSH 터널을 사용하며 Python+SQ를 사용하여 데이터베이스 MySQL을 연결하고자 합니다.LA케미.

콘솔에서 MySQL-client를 사용하고 "를 지정할 때ptotocol=TCP", 그럼 다 괜찮아요!명령어 사용:

mysql -h localhost —protocol=TCP -u USER -p

SSH 터널을 통해 원격 데이터베이스에 접근할 수 있습니다.

그러나 Python+를 사용하여 데이터베이스에 연결하고자 할 때SQLAchemy 다음과 같은 옵션을 찾을 수 없습니다.—protocol=TCP그렇지 않으면 로컬 MySQL 데이터베이스에만 연결할 수 있습니다.말씀해주세요, SQLA lchemy를 이용한 방법이 있을까요?

이 문제에 대한 고전적인 답은 다음과 같습니다.127.0.0.1또는 "특수 이름" 대신 호스트의 IP 또는 호스트 이름localhost. 설명서에서:

[...] 로컬 호스트에 대한 유닉스의 연결은 기본적으로 유닉스 소켓 파일을 사용하여 이루어집니다.

그리고 나중에:

유닉스에서 MySQL 프로그램은 다른 네트워크 기반 프로그램과 비교할 때 기대하는 것과 다른 방식으로 호스트 이름 localhost특별하게 처리합니다.로컬 호스트에 대한 연결의 경우 MySQL 프로그램은 유닉스 소켓 파일을 사용하여 로컬 서버에 연결을 시도합니다.포트 번호를 지정하기 위해 --port 또는 -P 옵션이 지정된 경우에도 발생합니다.클라이언트가 로컬 서버에 TCP/IP를 연결하도록 하려면 --host 또는 -h를 사용하여 호스트 이름 값 127.0.0.1 또는 로컬 서버의 IP 주소 또는 이름을 지정합니다.


그러나 사용자의 경우에는 이러한 단순한 속임수가 작동하지 않는 것으로 보이기 때문에 어떻게든 TCP 소켓을 사용하도록 강요해야 합니다.당신이 직접 설명한 것처럼, 호출할 때.mysql명령어 라인에서, 당신은--protocol tcp선택.

여기서 설명한 바와 같이, SQLLchemy에서 URL 옵션으로 또는 사용하여 관련 옵션을 드라이버에 전달할 수 있습니다.connect_args키워드 인수.

예를 들어 PyMySQL을 사용하는 경우, 테스트 시스템에서 이를 위해 설정한 경우(MariaDB 10.0.12, SQLChemy 0.9.8 및 PyMySQL 0.6.2) 다음과 같은 결과를 얻었습니다.

>>> engine = create_engine(
      "mysql+pymysql://sylvain:passwd@localhost/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:passwd@127.0.0.1/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:passwd@localhost/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',)]

두 개 모두 TCP 연결을 사용합니다(호스트 이름 뒤의 포트 번호 때문에 알고 있습니다).반면에:

>>> engine = create_engine(
      "mysql+pymysql://sylvain:passwd@localhost/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:passwd@127.0.0.1/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:passwd@localhost/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',)]

호스트 이름 뒤에 포트가 없습니다. UNIX 소켓입니다.

효과가 있었습니다.

import pandas as pd
import pymysql
from sqlalchemy import create_engine

cnx = create_engine('mysql+pymysql://<username>:<password>@<host>/<dbname>')    
df = pd.read_sql('SELECT * FROM <table_name>', cnx) #read the entire table

자격 증명이 다음과 같이 mysql 데이터베이스에 추가됩니다.

CREATE USER '<username>' IDENTIFIED BY '<password>';
GRANT ALL PRIVILEGES ON *.* TO '<username>' WITH GRANT OPTION;
FLUSH PRIVILEGES;

MySQL SQLchemy url에서 localhost 대신 127.0.0.1을 사용하는 설정(mysql-python 사용 중)에서 MySQL SQLchemy url이 작동합니다.이 시나리오(로컬 포트 3307이 있는 터널)에 정확하게 사용하고 있는 전체 URL은 다음과 같습니다.

mysql:/user:passwd@127.0.0.1:3307/

SQLAlchemy 1.0.5를 사용하고 있지만 크게 문제가 되지는 않는 것 같습니다.

xampp 서버의 mysql db와 연결하기 위해 시도했습니다.

from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://usrnme:passwd@hstnme/dbname")

Python 3.x를 사용하는 경우 다음을 사용할 수 있습니다.

pip install mysql-connector-python

그러면:

import sqlalchemy as db
engine = db.create_engine("mysql+mysqlconnector://username:password@hostname:port/dbname")

언급URL : https://stackoverflow.com/questions/29355674/how-to-connect-mysql-database-using-pythonsqlalchemy-remotely

반응형