Я пытаюсь записать несколько фреймов данных в mysql. Я использую mysql .connector для соединения и sqlalchemy для создания движка.
Большинство фреймов данных правильно записываются в базу данных. К сожалению, приложение останавливается со следующей ошибкой:
sqlalchemy.exc.DatabaseError: (mysql.connector.errors.DatabaseError) 2006 (HY000): MySQL server has gone away
...
During handling of the above exception, another exception occurred:
...
_mysql_connector.MySQLInterfaceError: MySQL server has gone away
Поскольку фрейм данных, который разрывает соединение, также является самым большим (файл pickle: 198 МБ), я предположил, что это связано с MySql -Установка сервера max_allowed_packet или тайм-аут . ( Как описано здесь )
Поэтому я расширил файл конфигурации в моем SQLConnector (см. Ниже) на 'connect_timeout': 900. К сожалению, безрезультатно. Я также прочитал, что вы должны настроить my.cnf сервера MySql. К сожалению, я не знал точно, где их найти. После долгих поисков я нашел следующий заказ. C: \ Program Files \ MySQL \ MySQL Сервер 8.0 \ et c с файлом mysqlrouter.conf.sample. Здесь Я скачал файл my.cnf и положить его в папку. К сожалению безрезультатно, потому что я не знал, как настроить MySql, чтобы сервер использовал этот файл.
Кто-нибудь знает, как я могу исправить эту ошибку? Или как мне настроить MySql Настройки сервера max_allowed_packet или тайм-аут?
Main:
mysqlConnector = MySQLConnector()
dbConnection = mysqlConnector.init_engine()
for df_tuple in df_all_tuple:
df_name = df_tuple[0]
df = pd.DataFrame(df_tuple[1])
df.to_sql(con=mydb, name=df_name, if_exists='fail', chunksize=20000)
SQLConnector:
import mysql.connector
from mysql.connector import errorcode
import sqlalchemy as db
config = {
'user': 'root',
'password': '',
'host': '127.0.0.1',
'database': 'test',
'raise_on_warnings': True,
'use_pure': False,
'autocommit': True,
'connect_timeout': 900
}
class MySQLConnector:
def __init__(self):
connectTest = self.connect()
print("Connection to database: " + str(connectTest))
def init_engine(self):
try:
connect_string = 'mysql+mysqlconnector://{}:{}@{}/{}?charset=utf8mb4'.format(config.get("user"),
config.get("password"),
config.get("host"),
config.get("database"),
pool_pre_ping=True)
print("Engine: " + connect_string)
sqlengine = db.create_engine(connect_string)
except:
print("SQLConnector: Sqlalchemy error. Can't create engine....")
else:
dbConnection = sqlengine.connect()
return dbConnection
def connect(self):
try:
con = mysql.connector.connect(**config)
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("Something is wrong with your user name or password")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print("Database does not exist")
if self.createDB() is True:
return self.connect()
elif err.errno == errorcode.CR_SERVER_GONE_ERROR:
print("The client couldn't send a question to the server.")
print("err: " + err)
elif err.errno == errorcode.CR_SERVER_LOST:
print(
"The client didn't get an error when writing to the server, but it didn't get a full answer (or any answer) to the question.")
print("err: " + err)
else:
print(err)
return None
else:
if con.is_connected():
db_Info = con.get_server_info()
print("Connected to MySQL Server version ", db_Info)
sqlcursor = con.cursor()
return con
def createDB(self):
try:
mydb = mysql.connector.connect(
host=config.get("host"),
user=config.get("user"),
passwd=config.get("password")
)
except mysql.connector.Error as err:
print(err)
else:
sqlcursor = mydb.cursor()
try:
sqlcursor.execute('CREATE DATABASE {}'.format(config.get("database")))
except mysql.connector.Error as err:
print(err)
return False
else:
print("Database created!")
return True