При попытке использовать функцию pandas.Dataframe.to_sql для импорта экземпляров pandas.Dataframe в базу данных SQLite в python, я обнаружил, что ошибки базы данных заблокированы.
Сначала я использую sqlite3 (python 3.7.3) для создания соединения с моим файлом базы данных.
При использовании sqlite3 для создания соединения с файлом базы данных я установил тайм-аут на 10 с и 30 с.Тем не менее, ошибка все еще возникает, и кажется, что ошибка возникает сразу после ожидания времени, которое я назначил параметру timeout.
Тогда я читаю вопрос здесь .Это говорит мне, чтобы установить sql.isolation_level = Нет.Я сделал это, и ошибка все еще происходит.
Затем я использую apsw для создания соединения с моим файлом базы данных.И установите connection.setbusytimeout (10000) (10 с), но ошибка по-прежнему возникает.
Одна важная вещь - при попытке использовать pandas.Dataframe.to_sql для импорта кадра данных в базу данных.Имя таблицы уже существует, и я установил для параметра if_exist значение «replace».
Сообщение об ошибке указывает, когда возникла ошибка блокировки при выполнении команды DROP из pandas.Dataframe.to_sql.
Вышеописанный процесс выполняется на платформе PyCharm IDE (профессиональная версия).Я использую PyCharm для запуска файла .py на диске.Все сообщения об ошибках выдаются PyCharm.Я тестирую эти коды с небольшими TSV-файлами, состоящими всего из 20+ строк записей.
Я также проверил папку, и в том же каталоге файла базы данных нет файлов -journal.Кроме того, я дал полные права доступа к файлу базы данных перед тестированием кодов.
Вот код, который я использовал для создания соединения с sqlite3.
```python
import sys
import os.path
import pandas as pd
import sqlite3
def compare_causal(c, d, e):
#Read a tsv file into pandas.dataframe
os.chdir(c)
patient_df = pd.read_csv(d, sep='\t')
patient_table = d[0:-4]
patient_db_path = os.path.join(e, "PID_patients_data.db")
#Build a connection
pat_connect = sqlite3.connect(patient_db_path, timeout=10.0)
pat_connect.isolation_level = None
#Import the pandas.dataframe to sql database
patient_df.to_sql(name=patient_table, con=pat_connect, if_exists='replace')
# There are other subsequent codes but they are all in the definition of the function compare_causal.
```
Вот код, который я использовал для создания соединения с apsw.
```python
import sys
import os.path
import pandas as pd
import apsw
def compare_causal(c, d, e):
#Read a tsv file into pandas.dataframe
os.chdir(c)
patient_df = pd.read_csv(d, sep='\t')
patient_table = d[0:-4]
patient_db_path = os.path.join(e, "PID_patients_data.db")
#Build a connection
pat_connect = apsw.Connection(patient_db_path)
pat_connect.setbusytimeout(10000)
#Import the pandas.dataframe to sql database
patient_df.to_sql(name=patient_table, con=pat_connect, if_exists='replace')
# There are other subsequent codes but they are all in the definition of the function compare_causal.
```
Вот сообщение об ошибке, которое я получил от sqlite-соединения:
Traceback (most recent call last):
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 1431, in execute
cur.execute(*args)
sqlite3.OperationalError: database is locked
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/skyxt/Google Drive/HKU_YANG_LAB/HKU_Academic_Issue/Python Learning/Python scripts/Database_related scripts/Compare_PID_causal_genes_sqlite.py", line 207, in <module>
"/Users/skyxt/Google Drive/HKU_YANG_LAB/HKU_Academic_Issue/Project PID WES/Patients_Database")
File "/Users/skyxt/Google Drive/HKU_YANG_LAB/HKU_Academic_Issue/Python Learning/Python scripts/Database_related scripts/Compare_PID_causal_genes_sqlite.py", line 37, in compare_causal
patient_df.to_sql(name=patient_table, con=patient_connect, if_exists='replace')
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py", line 2531, in to_sql
dtype=dtype, method=method)
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 460, in to_sql
chunksize=chunksize, dtype=dtype, method=method)
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 1546, in to_sql
table.create()
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 577, in create
self.pd_sql.drop_table(self.name, self.schema)
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 1566, in drop_table
self.execute(drop_sql)
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 1445, in execute
raise_with_traceback(ex)
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/compat/__init__.py", line 420, in raise_with_traceback
raise exc.with_traceback(traceback)
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 1431, in execute
cur.execute(*args)
pandas.io.sql.DatabaseError: Execution failed on sql 'DROP TABLE "sorted_A170618_Wang_PathwayCommons11_All_network_search_results"': database is locked
Вот сообщение об ошибке, которое я получил от apsw-соединения:
Traceback (most recent call last):
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 1431, in execute
cur.execute(*args)
File "src/cursor.c", line 236, in resetcursor
apsw.BusyError: BusyError: database is locked
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 1435, in execute
self.con.rollback()
AttributeError: 'apsw.Connection' object has no attribute 'rollback'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/skyxt/Google Drive/HKU_YANG_LAB/HKU_Academic_Issue/Python Learning/Python scripts/Database_related scripts/Compare_PID_causal_genes_sqlite.py", line 207, in <module>
"/Users/skyxt/Google Drive/HKU_YANG_LAB/HKU_Academic_Issue/Project PID WES/Patients_Database")
File "/Users/skyxt/Google Drive/HKU_YANG_LAB/HKU_Academic_Issue/Python Learning/Python scripts/Database_related scripts/Compare_PID_causal_genes_sqlite.py", line 37, in compare_causal
patient_df.to_sql(name=patient_table, con=patient_connect, if_exists='replace')
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py", line 2531, in to_sql
dtype=dtype, method=method)
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 460, in to_sql
chunksize=chunksize, dtype=dtype, method=method)
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 1546, in to_sql
table.create()
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 577, in create
self.pd_sql.drop_table(self.name, self.schema)
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 1566, in drop_table
self.execute(drop_sql)
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 1440, in execute
raise_with_traceback(ex)
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/compat/__init__.py", line 420, in raise_with_traceback
raise exc.with_traceback(traceback)
File "/Users/skyxt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 1435, in execute
self.con.rollback()
pandas.io.sql.DatabaseError: Execution failed on sql: DROP TABLE "sorted_A170618_Wang_PathwayCommons11_All_network_search_results"
BusyError: database is locked
unable to rollback