SQLAlchemy

**SQLAlchemy** merupakan sekumpulan perangkat lunak dengan sumber terbuka untuk SQL dan Pemetaan Objek Relasional (object-relational mapper disingkat dengan ORM) untuk bahasa pemrograman Python. Aplikasi ini dirilis dengan menggunakan Lisensi MIT.

## Deskripsi
SQLAlchemy berprinsip bahwa database relasional dapat dianggap seperti sekumpulan objek karena skalanya yang semakin besar. Selain itu kinerja dari sebuah database juga mulai menjadi perhatian.

Atas alasan ini maka pola pemetaan data (seperti Hibernate pada bahasa Java) kemudian menjadi pilihan untuk diadopsi ke dalam SQLAlchemy. Namun pengguna tetap dapat menggunakan sintaks deklaratif dengan menggunakan *[[plugin]]* yang disediakan.

## Sejarah
SQLAlchemy dirilis pertama sekali pada bulan Februari 2006. Saat ini SQLAlchemy menjadi salah satu alat bantu yang paling banyak digunakan di dalam komunitas Python.

## Contoh
Contoh berikut mewakili hubungan n-ke-1 dengan mengambil contoh kasus: film dan sutradaranya.

### Definisi skema
Membuat kelas dan tabel di dalam database: 
```python
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relation, sessionmaker

Base = declarative_base()

class Movie(Base):
    __tablename__ = 'movies'

    id = Column(Integer, primary_key=True)
    title = Column(String(255), nullable=False)
    year = Column(Integer)
    directed_by = Column(Integer, ForeignKey('directors.id'))

    director = relation("Director", backref='movies', lazy=False)

    def __init__(self, title=None, year=None):
        self.title = title
        self.year = year

    def __repr__(self):
        return "Movie(%r, %r, %r)" % (self.title, self.year, self.director)

class Director(Base):
    __tablename__ = 'directors'

    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False, unique=True)

    def __init__(self, name=None):
        self.name = name

    def __repr__(self):
        return "Director(%r)" % (self.name)

engine = create_engine('dbms://user:pwd@host/dbname')
Base.metadata.create_all(engine)
```


### Penyisipan data
Perintah berikut dapat digunakan untuk menyisipkan hubungan antara sutradara dan film dengan menggunakan salah satu entitas:

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

m1 = Movie("Robocop", 1987)
m1.director = Director("Paul Verhoeven")

d2 = Director("George Lucas")
d2.movies = [Movie("Star Wars", 1977), Movie("THX 1138", 1971)]

try:
    session.add(m1)
    session.add(d2)
    session.commit()
except:
    session.rollback()
```


### Query

```python
alldata = session.query(Movie).all()
for somedata in alldata:
    print somedata
```

*Query* berikut akan dibuat oleh SQLAlchemy ke DBMS:


```sql
SELECT movies.id, movies.title, movies.year, movies.directed_by, directors.id, directors.name
FROM movies LEFT OUTER JOIN directors ON directors.id = movies.directed_by
```


Keluaran atau hasil: 
```python
Movie('Robocop', 1987L, Director('Paul Verhoeven'))
Movie('Star Wars', 1977L, Director('George Lucas'))
Movie('THX 1138', 1971L, Director('George Lucas'))
```

Jika pengaturan `lazy=True` (bawaan) diaktifkan maka SQLAlchemy akan membuat *query* untuk mendapatkan daftar film. Bila diperlukan maka akan mengambil nama sutradara yang sesuai. Lihat contoh berikut: 
```sql
SELECT movies.id, movies.title, movies.year, movies.directed_by
FROM movies

SELECT directors.id, directors.name
FROM directors
WHERE directors.id = %s
```


## Lihat pula

* PySheds

## Referensi

; Catatan

* 
* Rick Copeland, Essential SQLAlchemy, O'Reilly, 2008, 

## Pranala luar

* Tutorial SQLAlchemy
* Situs Resmi