Mapowanie w SQLAlchemy
14 July 2008
Comments
Ten artykuł opisuje przestarzałą wersję biblioteki!
Oto przykład:
from sqlalchemy import *
db = create_engine('sqlite://')
db.echo = True
metadata = BoundMetaData(db)
users = Table('users', metadata,
Column('user_id', Integer, primary_key=True),
Column('name', String(40)),
Column('age', Integer),
)
users.create()
emails = Table('emails', metadata,
Column('email_id', Integer, primary_key=True),
Column('address', String),
Column('user_id', Integer, ForeignKey('users.user_id')),
)
emails.create()
i = users.insert()
i.execute(
{'name': 'Mary', 'age': 30},
{'name': 'John', 'age': 42},
{'name': 'Susan', 'age': 57},
{'name': 'Carl', 'age': 33}
)
i = emails.insert()
i.execute(
{'address': 'mary@example.com', 'user_id': 1},
{'address': 'john@nowhere.net', 'user_id': 2},
{'address': 'john@example.org', 'user_id': 2},
{'address': 'carl@nospam.net', 'user_id': 4},
)
# Puste klasy, które zostaną zmapowane
class User(object):
pass
class Email(object):
pass
# mapujemy (Klasa, obiekt_tabeli)
usermapper = mapper(User, users)
emailmapper = mapper(Email, emails)
# tworzymy sesję
session = create_session()
mary = session.query(User).selectfirst(users.c.name=='Mary')
mary.age += 1
session.flush()
fred = User()
fred.name = 'Fred'
fred.age = 37
print "About to flush() without a save()..."
session.flush() # nie zapisze danych Freda
session.save(fred)
print "Just called save(). Now flush() will actually do something."
session.flush() # Teraz zapisze
session.delete(fred)
session.flush()
class User(object):
pass
class Email(object):
pass
usermapper = mapper(User, users)
emailmapper = mapper(Email, emails)
session = create_session()
mary = session.query(User).selectfirst(users.c.name=='Mary')
session.flush()
fred = User()
fred.name = 'Fred'
fred.age = 37
session.save(fred)
session.delete(fred)
session.flush()
Ręczne zarządzanie transakcjami
Można przejąć ręczną kontrolę nad transakcjami. Oto przykład:transaction = session.create_transaction()
try:
# tutaj trochę operacji
session.flush()
# kolejna porcja
session.flush()
# wszystko się udało! zapisujemy
transaction.commit()
except:
# coś nie wyszło, cofamy niepełne zmiany
transaction.rollback()
# ... wypada wygenerować wyjątek
raise
Obiekt Query
Wykorzystane wcześniej session.query(klasa_lub_mapper) zwraca obiekt Query. Obiekt ten ma sporo ciekawych opcji:# select z WHERE i AND między warunkami
result = query.select_by(name='john', street='123 green street')
# pobranie 1 określonego wiersza
result = query.get_by(id=12)
#select_by_* i get_by_* gdzie * to nazwa kolumny, a argument to wartość
result = query.select_by_name('fred')
u = query.get_by_name('fred')
RkBlog
Comment article