SQLAlchemy

SQLAlchemyは、Pythonプログラミング言語のためのオープンソースのSQLツールキットおよびオブジェクト関係マッピングライブラリ（ORM）で、MIT Licenseの下で公開されている。
概要.
SQLAlchemyの哲学は、リレーショナルデータベースは規模が大きくなりパフォーマンスが懸念されるようになるにつれて、オブジェクトコレクションのように振る舞わなくなり、一方、オブジェクトコレクションは、抽象化が進むとテーブルや行のように振る舞わなくなる、という2つの原則に対応することである。このため、SQLAlchemyでは、他の多くのオブジェクトリレーショナルマッパーが採用しているアクティブレコードパターンではなく、を採用している（Java言語のHibernateと類似）。
歴史.
SQLAlchemyは2006年2月に最初にリリースされた。
例.
次の例は、映画とその監督との間の n対1 の関係を表している。ユーザー定義のPythonクラスに対応するデータベーステーブルを作成する方法、リレーションシップを持つインスタンスをリレーションの両側から作成する方法、最後にデータを検索する方法について、遅延読み込みと一括読み込みの両方で自動生成されたSQLクエリを説明する。
スキーマ定義.
2つのPythonクラスとそれに対応するデータベーステーブルをDBMSに作成する。
<Syntaxhighlight lang="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)
</Syntaxhighlight>
データ挿入.
監督と映画の関係は、どちらかのエンティティを介して挿入することができる。
<Syntaxhighlight lang="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()
</Syntaxhighlight>
クエリ.
alldata = session.query(Movie).all()
for somedata in alldata:
 print(somedata)
SQLAlchemyは、DBMSに次のクエリを発行する（エイリアスは省略）。
<Syntaxhighlight lang="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
</Syntaxhighlight>
この出力は次のようになる。
<Syntaxhighlight lang="python">
Movie('Robocop', 1987L, Director('Paul Verhoeven'))
Movie('Star Wars', 1977L, Director('George Lucas'))
Movie('THX 1138', 1971L, Director('George Lucas'))
</Syntaxhighlight>
代わりに codice_1 （default）を指定すると、SQLAlchemyは、はじめに映画のリストを取得し、必要な場合のみ（遅延、lazy）それぞれの監督に対応する監督 の名前を取得するクエリを発行する。
<Syntaxhighlight lang="sql">
SELECT movies.id, movies.title, movies.year, movies.directed_by
FROM movies
SELECT directors.id, directors.name
FROM directors
WHERE directors.id = %s
</Syntaxhighlight>