Ошибка при работе с файлом базы данных: sqlite3.DatabaseError: file is not a database

179
23 апреля 2022, 19:50

Задача, которую не выходит решить: написать на Python простейший код, который будет показывать таблицу из БД.

Исходные данные:

Файл test.sql ЭКСПОРТированный ИЗ PhpMyAdmin
Дериктория с файлом test.sql
Таблица test_table фнутри файла

Код test.sql

-- MySQL dump 10.16  Distrib 10.1.44-MariaDB, for debian-linux-gnu (i686)
--
-- Host: localhost    Database: test
-- ------------------------------------------------------
-- Server version   10.1.44-MariaDB-0ubuntu0.18.04.1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `test_table`
--
DROP TABLE IF EXISTS `test_table`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test_table` (
  `iD` int(3) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */
--
-- Dumping data for table `test_table`
--
LOCK TABLES `test_table` WRITE;
/*!40000 ALTER TABLE `test_table` DISABLE KEYS */;
INSERT INTO `test_table` VALUES (5);
/*!40000 ALTER TABLE `test_table` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

Далее, написал на Python3 следующий скрипт:

import sqlite3
import os.path
BASE_DIR = os.path.dirname(os.path.abspath("/path/to/test.sql"))
db_path = os.path.join(BASE_DIR, "test.sql")
with sqlite3.connect(db_path) as db:
    cursor = db.cursor()
    cursor.execute("Select *From Test_table")
    results = cursor.fetchall()
    print(results)
conn.close()

Что уже сделал:

  1. Пытался создать файл с расширением .sqlite, используя онлайн конвертеры или с помощью скрипта mysql2sqlite.sh При использовании онлайн конвертеров никаких файлов с расширением .sqlite НЕ получается. На выходе имеем таблицу .csv и какой-то файл column. Абсолютно не понимаю, как с ними работать
  2. Пробовал импортировать файл в MariaDB и оттуда генерировать файл базы данных. Опять получается не база данных, а её дамп с расширением .sql
  3. Генерировал из PhpMyAdmin файлы с другими расширениями Скрипт на Python то ругается, что это не файл базы данных, то говорит, что не видит там никаких таблиц в то время, как вижу я
  4. Юзал вдоль и поперек habr
  5. Искал советы на англоязычном стеке

Ничего не помогло.

Как можно решить эту задачу?

Answer 1

Как вам уже неоднократно написали в комментариях, SQL файлы предназначены для обработки на стороне соответствующей СУБД (Система Управления Базой Данных). Т.е. SQL код выполняется непосредственно в соответствующей СУБД.

Соответственно SQL файлы невозможно выполнить / запустить из Python, не отправив SQL код на выполнение СУБД.

Для того, чтобы прочитать данные из БД при помощи Python нужно выполнить следующие операции:

  1. установить Python модули / драйвера для работы с нужной вам СУБД
  2. установить SQLAlchemy - как универсальную прослойку для работы с БД (можно обойтись и без SQLAlchemy, но тогда код может сильно отличаться для различных СУБД)
  3. собрать правильную строку подключения к БД (чаще всего проблемы возникают на этом шаге). Советую внимательно посмотреть примеры подключения к различным СУБД в документации по SQLAlchemy.
  4. дальше можно читать данные из таблиц любым удобным вам способом. Для удобства и простоты я воспользовался модулем Pandas - данные в нем можно прочитать одной строкой. Если делать это обычными средствами, то вам придеться итерироваться по строкам и столбцам и код будет гораздо более громоздким.

Вот вам код для чтения данных из MySQL таблицы из Python, вывода на печать и сохранение в CSV файл и Excel таблицу:

from sqlalchemy import create_engine
import pymysql
import pandas as pd
db_host = "mysql_server_hostname"
db_user = "mysql_user_name"
db_pwd = "mysql_password_for_specified_user"
db_name = "test" # MySQL database name
db_charset = "utf8mb4"
db_connection = f"mysql+pymysql://{db_user}:{db_pwd}@{db_host}/{db_name}?charset={db_charset}"
conn = create_engine(db_connection)
# читаем все строки из таблицы `mysql_table_name` в Pandas DataFrame
df = pd.read_sql("SELECT * FROM mysql_table_name", conn)
# вывод данных на экран (по умолчанию показывается максимум 15-20 строк, т.е. только первые и последние строки)
print(df)
# сохранение данных из таблицы в CSV файл
df.to_csv("/path/to/table_name.csv", index=False)
# сохранение данных из таблицы в Excel файл
df.to_excel("/path/to/table_name.xlsx", index=False)

PS для того, чтобы этот код работал правильно необходимо сначала установить используемые Python модули:

pip install pandas
pip install SQLAlchemy
pip install PyMySQL
READ ALSO
PHP: замена ссылок в тексте из базы данных

PHP: замена ссылок в тексте из базы данных

В базе данных есть текстовый столбец, в котором хранятся ссылки и текст:

165
LARAVEL: как использовать функцию replace в DB

LARAVEL: как использовать функцию replace в DB

Как использовать функцию REPLACE() в Laravel 57?

234
16 пунктов выбора в поиске в 1 команде Mysql. PHP

16 пунктов выбора в поиске в 1 команде Mysql. PHP

Коллеги, необходимо организовать поиск по 16 пунктам, не закидывайте камнями, я учусь как и все вы

142
Ежедневный буфер активности

Ежедневный буфер активности

Нужен советСовсем скоро планирую добавить на сайт модуль по сбору информации о активности пользователя и подсчёта этой активности

155