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
'programing' 카테고리의 다른 글
첫째 아이로 요소를 삽입하는 방법은? (0) | 2023.10.27 |
---|---|
PowerShell에서 "배치 작업 종료(Y/N)" 확인을 억제하려면 어떻게 해야 합니까? (0) | 2023.10.27 |
내가 파워셸인지 cmd인지 어떻게 판단합니까? (0) | 2023.10.27 |
트래비스가 도커 컨테이너를 구축하는 동안 phpunit 테스트를 실행하려면 어떻게 해야 합니까? (0) | 2023.10.27 |
Apache2를 통해 연결하는 동안에만 원격 MySqli Connection 시간 초과 (0) | 2023.10.27 |