Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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)
...
  • 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

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

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

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

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

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

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

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

http://yserial.sourceforge.net

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top