Использование SQLite в программе Python

Я создал модуль Python, который создает и заполняет несколько таблиц SQLite. Теперь я хочу использовать его в программе, но я действительно не знаю, как правильно его называть. Все обучающие материалы, которые я нашел, по сути являются "встроенными", то есть они проходят через SQLite линейным способом, а не как фактически использовать его в процессе производства.

То, что я пытаюсь сделать, это проверить метод, чтобы узнать, была ли уже создана база данных. Если да, то я могу использовать его. Если нет, создается исключение, и программа создаст базу данных. (Или используйте инструкции if/else, в зависимости от того, что лучше).

Я создал тест script, чтобы проверить правильность моей логики, но она не работает. Когда я создаю оператор try, он просто создает новую базу данных, а не проверяет, существует ли она уже. В следующий раз, когда я запустил script, я получаю сообщение об ошибке, что таблица уже существует, даже если я попытался поймать исключение. (Я не использовал try/except before, но решил, что это подходящее время для изучения).

Есть ли хорошие учебные пособия для оперативного использования SQLite или какие-либо предложения о том, как это кодировать? Я просмотрел учебник pysqlite и другие, которые я нашел, но они не рассматривают это.

Ответы

Ответ 1

AFAIK база данных SQLITE - это просто файл. Чтобы проверить, существует ли база данных, проверьте наличие файла.

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

Если вы попытаетесь открыть файл в виде базы данных sqlite3, которая НЕ является базой данных, вы получите следующее:

"sqlite3.DatabaseError: файл зашифрован или не является базой данных

поэтому проверьте, существует ли файл, а также убедитесь, что вы попытаетесь поймать исключение, если файл не является базой sqlite3

Ответ 2

Не делайте это более сложным, чем нужно. Большие независимые базы данных имеют сложные требования к настройке и настройке. SQLite - это просто файл, доступ к которому вы используете с SQL, это намного проще.

Сделайте следующее.

  • Добавьте таблицу в свою базу данных для "Компоненты" или "Версии" или "Конфигурация" или "Релиз" или что-то административное.

    СОЗДАТЬ РЕЗУЛЬТАТ ТАБЛИЦЫ (   RELEASE_NUMBER CHAR (20) );

  • В вашем приложении обычно подключайтесь к своей базе данных.

  • Выполните простой запрос к таблице ревизий. Вот что может случиться.
    • Запрос не выполняется: ваша база данных не существует, поэтому для ее создания выполните ряд инструкций CREATE.
    • Запрос выполняется успешно, но не возвращает строк, или номер выпуска ниже ожидаемого: ваша база данных существует, но устарела. Вам нужно перейти с этой версии на текущую версию. Надеемся, у вас есть последовательность операторов DROP, CREATE и ALTER для этого.
    • Запрос выполнен успешно, а номер выпуска - ожидаемое. Ничего больше, ваша база данных настроена правильно.

Ответ 3

SQLite автоматически создает файл базы данных при первом использовании. Операторы SQL для создания таблиц могут использовать IF NOT EXISTS, чтобы команды вступили в силу, если таблица не была создана. Таким образом, вам не нужно проверять наличие базы данных заранее: SQLite может позаботиться об этом для вас.

Главное, что я все равно буду беспокоиться о том, что выполнение CREATE TABLE IF EXISTS для каждой транзакции в Интернете (скажем) будет неэффективным; вы можете избежать этого, если программа сохранит переменную (in-memory), сообщив, создала ли она базу данных сегодня, поэтому она запускает CREATE TABLE script один раз за каждый прогон. Это все равно позволит вам удалить базу данных и начать ее во время отладки.

Ответ 4

Как отметил @diciu, файл базы данных будет создан sqlite3.connect. Если вы хотите выполнить специальное действие, когда файла нет, вам нужно явно проверить наличие:

import os
import sqlite3
if not os.path.exists(mydb_path):
    #create new DB, create table stocks
    con = sqlite3.connect(mydb_path)
    con.execute('''create table stocks
      (date text, trans text, symbol text, qty real, price real)''')
else:
    #use existing DB
    con = sqlite3.connect(mydb_path)
...

Ответ 5

  • Sqlite не генерирует исключение, если вы создаете новую базу данных с тем же именем, она просто подключится к ней. Поскольку sqlite является файловой базой данных, я предлагаю вам просто проверить наличие файла.
  • О вашей второй проблеме, чтобы проверить, была ли уже создана таблица, просто поймайте исключение. Исключение "sqlite3.OperationalError: table TEST уже существует" вызывается, если таблица уже существует.
import sqlite3
import os
database_name = "newdb.db"
if not os.path.isfile(database_name):
    print "the database already exist"
db_connection = sqlite3.connect(database_name)
db_cursor = db_connection.cursor()
try:
    db_cursor.execute('CREATE TABLE TEST (a INTEGER);')
except sqlite3.OperationalError, msg:
    print msg

Ответ 6

Выполнение SQL в целом ужасно на любом языке, который я выбрал. SQLalchemy показала, что проще всего использовать их, потому что фактический запрос и фиксация с ним настолько чисты и отсутствуют из-за проблем.

Здесь некоторые основные шаги по использованию sqlalchemy в вашем приложении, более подробные сведения можно найти в документации.

  • предоставлять определения таблиц и создавать ORM-сопоставления
  • загрузить базу данных
  • попросите его создать таблицы из определений (не будет, если они существуют)
  • создать создатель сеанса (необязательно)
  • создать сеанс

После создания сеанса вы можете выполнить фиксацию и запрос из базы данных.

Ответ 7

Посмотрите это решение на SourceForge, которое охватывает ваш вопрос в учебном руководстве, с инструктивным исходным кодом:

y_serial.py модуль:: хранилище объектов Python с SQLite

"Сериализация + персистентность:: в нескольких строках кода, сжатие и аннотирование объектов Python в SQLite, а затем их хронологически восстановить по ключевым словам без какого-либо SQL. Самый полезный" стандартный "модуль для базы данных для хранения данных без схемы."

http://yserial.sourceforge.net

Ответ 8

Да, я искал проблему. Все, что мне нужно было сделать, это проверить файл и поймать IOError, если он не существует.

Спасибо за все остальные ответы. Они могут пригодиться в будущем.