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 |