====== SQLAlchemy ======
* Site web : [[https://www.sqlalchemy.org/]]
* Documentation : [[https://docs.sqlalchemy.org/en/20/index.html]] (version 2.0)
* Tutorial : [[https://docs.sqlalchemy.org/en/20/tutorial/index.html]]
* Firebird : [[https://docs.sqlalchemy.org/en/20/dialects/firebird.html]]
* Doc de SQLAlchemy-Firebird : [[https://pypi.org/project/sqlalchemy-firebird/]]
===== Installation =====
Avec le support de Firebird :
pip install sqlalchemy fdb sqlalchemy-firebird
Tester la version :
import sqlalchemy
sqlalchemy.__version__
===== Configuration de la connexion =====
from sqlalchemy import create_engine
import sys
# Paramètres de connexion
user_name = "sysdba"
password = "masterkey"
server = "localhost"
dbpath = "c:/path/to/database.fdb" # sous Linux : "/path/to/database.fdb"
# Chemin vers la librairie cliente
fb_library_name = sys.path[0] + '\\fbclient.dll'
engine = create_engine("firebird+fdb://%s:%s@%s/%s?fb_library_name=%s" % (
user_name,
password,
server,
dbpath,
fb_library_name
))
===== Requêtes SQL =====
Requête Select :
from sqlalchemy import text
with engine.connect() as conn:
result = conn.execute(text("select id, nom from clients order by nom"))
# Afficher tous les résultats dans une liste de tuples :
print(result.all())
# Parcourir le résultat et afficher les lignes individuellement :
for row in result:
print(f"{row.id} : {row.nom.strip()}")
Requêtes transactionnelles avec un **commit()** à la fin :
from sqlalchemy import text
with engine.connect() as conn:
conn.execute(text("CREATE TABLE some_table (x int, y int)"))
conn.execute(
text("INSERT INTO some_table (x, y) VALUES (:x, :y)"),
[{"x": 1, "y": 1}, {"x": 2, "y": 4}],
)
conn.commit()
Requêtes transactionnelles dans un bloc **begin()** (le commit se fait implicitement) :
from sqlalchemy import text
with engine.begin() as conn:
conn.execute(
text("INSERT INTO some_table (x, y) VALUES (:x, :y)"),
[{"x": 1, "y": 1}, {"x": 2, "y": 4}],
)
===== Modèle =====
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = "mytable"
id = Column(Integer, primary_key=True)
name = Column(String(100))
def __repr__(self):
return u"" % (self.id, self.name.strip())
===== Requête =====
from sqlalchemy import select
stmt = select(User).where(User.id < 20)
users = session.scalars(stmt).all()
for user in users:
print(user)