При попытке импортировать файл данных pandas в sqlite db возникает заблокированная ошибка. - PullRequest
0 голосов
/ 29 мая 2019

При попытке использовать функцию 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
...