Bauke Brenninkmeijer
MSc in CS and Data Science @Nijmegen
Data Scientist @ABNAMRO since 2019
@baukebrenninkmeijer
PyODBC vs. SQLAlchemy
SQLAlchemy actually has 2/4 different APIs
# SQLAlchemy # imports... engine = create_engine('sqlite:///:memory:', echo=True) Base = declarative_base() # Define a class that represents the users table class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) age = Column(Integer) Base.metadata.create_all(engine) # create the table in the database
# PyODBC import pyodbc conn = pyodbc.connect('DRIVER={SQLite3};DATABASE=test.db') cursor = conn.cursor() cursor.execute(''' CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT, age INTEGER ) ''') conn.commit() conn.close()
Python typehints
# SQLAlchemy Session = sessionmaker(bind=engine) session = Session() # Insert some data into the table using the User class session.add_all([ User(name='Alice', age=25), User(name='Bob', age=30), User(name='Charlie', age=35) ]) session.commit()
Just raw text. Hard to programmatically extend reliable. No SQL injection prevention.
# PyODBC cursor.execute(''' INSERT INTO users (name, age) VALUES ('Alice', 25), ('Bob', 30), ('Charlie', 35) ''')
from sqlalchemy import select session.scalars( select(User) ).all()
[User(id=1, name=Alice, age=25), User(id=2, name=Bob, age=30), User(id=3, name=Charlie, age=35)]
# PyODBC cursor.execute('SELECT * FROM users') # Fetch and print the rows from the query result rows = cursor.fetchall() for row in rows: print(row)
(1, 'Alice', 25) (2, 'Bob', 30) (3, 'Charlie', 35)
with table User and Address
User
Address
result = session.execute( select(User.name, Address.email_address) .join(User.addresses) .order_by(User.id, Address.id) )
session.scalars(select(User).where(User.age > 28)).all()
[User(id=2, name=Bob, age=30), User(id=3, name=Charlie, age=35)]
new_user = User(name='dennis', age=58) session.add( new_user ) session.commit()
from sqlalchemy import update stmt = ( update(User) .where(User.name == "Alice") .values(name="Alice the Third von Baumgarten") ) session.execute(stmt) session.commit()
user = session.query(User).filter_by(id=1).first() user.name = "Bob" session.commit()
from sqlalchemy import delete stmt = delete(User).where(User.name.in_(["Bob"])) session.execute(stmt)
Looking at an API?