pandas to_sql sqlalchemy соединение с secure_transport - PullRequest
2 голосов
/ 15 октября 2019

Я пытаюсь отправить данные в базу данных mysql на сервере, который имеет --require_secure_transport = ON.

Когда я пытаюсь подключиться к нему с помощью следующего кода

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 Ответ

1 голос
/ 17 октября 2019

Разобрался с решением после осмотра немного больше.

Mysql обычно настроен на генерацию файлов CA и ключей на лету, если он не был ему предоставлен, но проблема была в отправке правильного флага в pymysql, поэтому он не ищет локальный CAфайл.

Обнаружил это здесь: Невозможно установить TLS TCP-соединение с удаленным MySQL-сервером с PyMySQL, другие инструменты работают

Вы просто передаете словарь с помощью "sslmsgstr "ключ, имеющий словарь с одним ключом со значением 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')

Надеюсь, кто-то еще найдет это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...