通过secure_transport连接熊猫to_sql sqlalchemy

时间:2019-10-15 14:22:18

标签: python python-3.x pandas ssl sqlalchemy

我正在尝试将数据发送到具有--require_secure_transport = ON的服务器上的mysql数据库。

当我尝试使用以下代码连接到它时

import pandas as pd
import pymysql
from sqlalchemy import create_engine

connect_string = 'mysql+pymysql://{}:{}@{}/{}'.format(user,pw,host,database)
connector = create_engine(connect_string)   
df = pd.read_csv('iris.data')
df.to_sql('iris',connector,if_exists='replace',index_label='id')

我遇到以下错误

InternalError: (pymysql.err.InternalError) (3159, 'Connections using insecure transport are prohibited while --require_secure_transport=ON.') (Background on this error at: http://sqlalche.me/e/2j85)

我已经搜索了有关如何使连接器使用secure_transport的选项,但是我找不到任何有效的方法。

我发现一种解决方案要求将?ssl = true添加到connect_string的末尾

connect_string = 'mysql+pymysql://{}:{}@{}/{}?ssl=true'.format(user,pw,host,database)

但这给出了以下错误

    ca = sslp.get('ca')

AttributeError: 'str' object has no attribute 'get'

我只能通过pymysql这样连接到数据库

ssl={'ssl': {'key': 'ssl/client-key.pem','cert': 'ssl/client-cert.pem','ca': 'ssl/ca-cert.pem'}}
con = pymysql.Connect(host,user,pw,database,ssl=ssl)
cur = con.cursor()
cur.execute("show tables;")

但是我找不到用sqlalchemy连接器实现此方法的方法。 任何人都对如何使它正常工作有一些建议?

致谢

1 个答案:

答案 0 :(得分:1)

多看一遍,找出解决方案。

通常将Mysql设置为在未提供时动态生成ca文件和密钥,但是问题是向pymysql发送了正确的标志,因此它不会去寻找本地ca文件。 / p>

在这里发现了这一点: Unable to make TLS TCP connection to remote MySQL server with PyMySQL, other tools work

您只需传递一个带有“ ssl”键的字典,该字典具有一个带有值为True的键的字典。为了清楚起见,我使用键名“ fake_flag_to_enable_tls”,但看起来似乎可以。

connect_args={'ssl':{'fake_flag_to_enable_tls': True}}
connect_string = 'mysql+pymysql://{}:{}@{}/{}'.format(user,pw,host,database)
connector = create_engine(connect_string,connect_args=connect_args) 
df = pd.read_csv('iris.data')
df.to_sql('iris',connector,if_exists='replace',index_label='id')

希望其他人觉得这有用。