我最近更改了我的项目以使用sqlalchemy,并且我的项目运行良好,它使用了外部mysql Server。
现在,我正在尝试使用SSL CA与其他MySQL服务器一起工作,并且它不连接。
(它确实使用MySQL Workbench进行了连接,因此证书应该很好(
我正在使用以下代码:
ssl_args = {'ssl': {'ca': ca_path}}
engine = create_engine("mysql+pymysql://<user>:<pass>@<addr>/<schema>",
connect_args=ssl_args)
我会收到以下错误:
无法连接到' addr '上的mySQL Server([[WinError 10054]现有连接被远程主机强行关闭(
(
有什么建议?
我将dbapi更改为mysql-connector,并使用以下代码:
ssl_args = {'ssl_ca': ca_path}
engine = create_engine("mysql+mysqlconnector://<user>:<pass>@<addr>/<schema>",
connect_args=ssl_args)
现在起作用。
如果您只从具有SSL连接的客户端计算机连接(因此您无法访问证书和钥匙(,则可以简单地将SSL = true添加到URI。
编辑:
例如: mysql_db = "mysql+mysqlconnector://<user>:<pass>@<addr>/<schema>?ssl=true"
官方文档有充分记录:
engine = create_engine(
db_url,
connect_args={
"ssl": {
"ssl_ca": "ca.pem",
"ssl_cert": "client-cert.pem",
"ssl_key": "client-key.pem"
}
}
)
另一个解决方案是使用sqlalchemy.engine.url.url定义URL并将其传递给create_engine。
sqlUrl = sqlalchemy.engine.url.URL(
drivername="mysql+pymysql",
username=db_user,
password=db_pass,
host=db_host,
port=3306,
database=db_name,
query={"ssl_ca": "main_app/certs/BaltimoreCyberTrustRoot.crt.pem"},
)
create_engine(sqlUrl)
您可以在查询参数中将SSL参数作为字典包含。
如果您使用烧瓶来使用config参数(如sqlalchemy_database_uri(而不是直接使用create_engine来初始化sqlalchemy引擎。