poprzedni temat | w górę | następny temat

Obsługa baz danych SQL

SQLite

Trudno znaleźć system zarządzania bazą danych, którego obsługi nie byłoby w Pythonie. Jako przykładu użyjemy SQLite, ponieważ nie wymaga on instalacji serwera.

import sqlite3

connection = sqlite3.connect('database.db')
cursor = connection.cursor()
cursor.execute(
  '''
    CREATE TABLE books
      (
        id INTEGER PRIMARY KEY ASC,
        title TEXT,
        author TEXT,
        year INTEGER
      )
  '''
)
library = [
  (1, u'The C Programming Language', u'Kernighan, B. & Ritchie, D.', 1988),
  (2, u'Gödel, Escher, Bach', u'Hofstadter, D.', 1979),
  (3, u'The Feynman Lectures on Physics', u'Feynman, R.', 1964),
  (4, u'The Art of Unix Programming', u'Raymond, E.', 2003),
  (5, u'Introduction to Algorithms', u'Cormen, T. & Leiserson, C. & Rivest, R. & Stein, C.', 1990),
]
cursor.executemany('INSERT INTO books VALUES (?, ?, ?, ?)', library)

for _, title, author, year in cursor.execute('select * from books'):
  print author, title, year

connection.commit()
connection.close()

SQLAlchemy

Bilbioteka SQLAlchemy znacząco ułatwia obsługę baz danych, oferując mapowanie obiektowo-relacyjne (ORM) czyli wiersze z tabel udostępniane są jako obiekty Pythona.

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class Book(Base):
  __tablename__ = 'books'
  id = Column(Integer, primary_key=True)
  title = Column(String(100), nullable=False)
  author = Column(String(100))
  year = Column(Integer)

engine = create_engine('sqlite:///database.db', echo=True)

Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()

for book in session.query(Book).filter(Book.title.like('%n_x%')).all():
  print book.author, book.title

new_book = Book(
  title=u'Concrete Mathematics',
  author=u'Graham, R. & Knuth, D. & Patashnik, O.',
  year=1994
)
session.add(new_book)
session.commit()

Zadania

  1. Zmodyfikuj przykład z sekcji dotyczącej SQLite poprzez anulowanie transakcji dodania wartości do bazy.

  2. Zmodyfikuj bazę tak, aby zawierała tabelę z autorami, która będzie kluczem obcym dla tabeli z książkami.

  3. Przy użyciu SQLAlchemy pobierz książki, które mają więcej, niż jednego autora.

  4. Usuń książki wydane przed 1984 rokiem.

poprzedni temat | w górę | następny temat