我正在尝试使用Python 3连接到GCP Cloud SQL实例,并且不想使用云代理,我只想直接使用SSL证书进行连接,因此我遵循了GCP指南here进行连接用ssl密钥保护的公共IP。
使用此方法可用于mysql客户端:
mysql -uroot -pMyPassWord -h 1.2.3.4 --ssl-ca=server-ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem
但是当我做我认为与Python相同的事情时,我会得到一个错误:
from sqlalchemy import create_engine
db_connect_string='mysql+mysqldb://root:MyPassWord@1.2.3.4:3306/mydb'
ssl_args = {'ssl': {'ssl_cert':'./client-cert.pem', 'ssl_key':'./client-key.pem', 'ssl_ca':'./server-ca.pem'}}
engine = create_engine(db_connect_string, connect_args=ssl_args)
print(engine.table_names())
错误是:
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError)(1045,“用户的访问被拒绝 'root'@'1.2.3.4'(使用密码:是)“)(此错误的背景信息位于: http://sqlalche.me/e/e3q8)
如果不是因为我:
我想念什么?
答案 0 :(得分:0)
好,终于成功了。错误消息具有误导性,因为您希望它与将我的IP列入白名单有关,但事实并非如此。这是工作代码:
from sqlalchemy import create_engine
db_connect_string='mysql+mysqldb://root:MyPassWord@1.2.3.4:3306/mydb'
ssl_args = {'ssl': {'cert':'./client-cert.pem', 'key':'./client-key.pem', 'ca':'./server-ca.pem'}}
engine = create_engine(db_connect_string, connect_args=ssl_args)
print(engine.table_names())
mysqlclient需要一个带有密钥对的名为ssl的字典,但是我在堆栈上可以找到的所有其他答案都是错误的,或者它们已经被更改了。
以下是作为参数传递所需的字典链接:
https://mysqlclient.readthedocs.io/user_guide.html#installation
这是MySQL文档,解释了参数:
https://dev.mysql.com/doc/refman/8.0/en/mysql-ssl-set.html
此处的参数完整列表: