Использование SQLite в программе Python - PullRequest
14 голосов
/ 17 октября 2008

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

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

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

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

Ответы [ 8 ]

29 голосов
/ 17 октября 2008

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

Выполните следующие действия.

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

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

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

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

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

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

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

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

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

7 голосов
/ 17 октября 2008

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

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

5 голосов
/ 17 октября 2008

Как указал @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)
...
4 голосов
/ 17 октября 2008
  • Sqlite не выдает исключение, если вы создаете новую базу данных с тем же именем, она просто подключается к ней. Поскольку sqlite - это файловая база данных, я предлагаю вам просто проверить наличие файла.
  • О вашей второй проблеме: чтобы проверить, была ли таблица уже создана, просто перехватите исключение. Исключение «sqlite3.OperationalError: таблица 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
3 голосов
/ 17 октября 2008

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

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

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

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

2 голосов
/ 13 сентября 2009

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

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

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

http://yserial.sourceforge.net

0 голосов
/ 18 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...