# Python - SQLAlchemy
A technical memo for ORM libarary
## Create Table
```python
from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, String, Integer
from sqlalchemy import create_engine
# Create ORM base model
Base = declarative_base()
# Create table's corresponding class
class User(Base):
__tablename__ = "user"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(32), index=True)
def __init__(self, id, name):
self.id = id
self.name = name
# Create connection
engine = create_engine("database url", echo=True)
# Create table in database
Base.metadata.create_all(engine)
```
## CRUD Operation
### Create
```python
from create_table import User
from create_table import engine
from sqlalchemy.orm import Session
# Create one
with Session(engine) as session:
user = User("Harry Potter")
session.add(user)
session.commit()
# Create multiple
with Session(engine) as session:
session.add_all(
[
User("John Wick"),
User("Tony Stark"),
User("SpongeBob SquarePants")
]
)
session.commit()
```
### Read
```python
from sqlalchemy.orm import Session
from create_table import engine, User
# select all
with Session(engine) as session:
user_list = session.query(User).all()
for user in user_list:
print(user.id, user.name)
# select first
with Session(engine) as session:
user = session.query(User).first()
print(user.id, user.name)
# select with condition
with Session(engine) as session:
user_list = session.query(User).filter(User.id == 4).all()
for user in user_list:
print(user.id, user.name)
with Session(engine) as session:
user_list = session.query(User).filter_by(id=4).all()
for user in user_list:
print(user.id, user.name)
```
Multiple Conditions: ```and_()```, ```or_()```
```python
from sqlalchemy import and_, or_
filtered_users = session.query(User).filter(and_(condition1, condition2)).all()
filtered_users = session.query(User).filter(or_(condition1, condition2)).all()
```
### Update
```python
from sqlalchemy.orm import Session
from create_table import engine, User
# Update data
with Session(engine) as session:
result = session.query(User).filter(User.id == 4).update({"name": "Super Mario"})
print(result) # 1
session.commit()
```
### Delete
```python
from sqlalchemy.orm import Session
from create_table import engine, User
# Delete
with Session(engine) as session:
result = session.query(User).filter(User.id == 8).delete()
print(result) # 1
session.commit()
```
## Foreign Key
```python
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine, Column, String, Integer, ForeignKey
from sqlalchemy.orm import relationship
Base = declarative_base()
engine = create_engine("url", echo=True)
class Student(Base):
__tablename__ = "students"
id = Column(Integer, primary_key=True)
name = Column(String(32), nullable=False)
school_id = Column(Integer, ForeignKey("schools.id"))
schools = relationship("School", backref="student")
class School(Base):
__tablename__ = "schools"
id = Column(Integer, primary_key=True)
name = Column(String(32), nullable=False)
Base.metadata.create_all(engine)
```
Use```schools = relationship("School", backref="student")``` to add students to school:
```python
from create_table_foreign import engine, School, Student
from sqlalchemy.orm import Session
with Session(engine) as session:
sch = School(name="Taipei")
sch.student = [Student(name="John Wick"), Student(name="Harry Potter")]
session.add(sch)
session.commit()
```