July 9, 2022

SQLAlchemy + PostgreSQL

Как устроена эта статья:

1. Введение

2. Установка PostgreSQL

3. ORM и Core

4. Примеры использований

5. Заключение


Введение

SQLAlchemy — это библиотека на языке Python для работы с реляционными базами данных с применением технологии ORM (Object Relational Mapper). Оно позволяет описывать структуры баз данных и способы взаимодействия с ними без использования чистого SQL. SQLAlchemy также позволяет работать не только с postgres, но и с MySQL, SQLite, Oracle. Используется в такие компаниях как reddit, Yelp!, DropBox.


Установка PostgreSQL

Что бы начать работать с sqlalchemy используя postgres, надо скачать сам PostgreSQL.

Для установки переходим на сам сайт, выбираем нужную операционную систему и скачиваем postgress удобным способом.

При установке выбираем место где будет храниться postgres, компоненты которые будут скачиваться (лучше выбрать все), пароль для бд, порт (можно оставить тот что стоит по умолчанию что бы потом проблем не было), опцию в конце (builder) можно не поставить.

Теперь сервер для бд установлен, если надо к нему подключится например с другого пк надо поменять конфиг в файлах postgres и открыть порт, который указали при установке подробнее тут. Если надо взаимодействовать локально, то уже можно начать, сделать это можно в pgAdmin 4 (который установился вместо postgresql) а так же можно использовать другие более удобные приложения Dbeaver, DataGrip. По дефолту создается первая бд "postgres" для ознакомления с sqlalchemy можно использовать её, потом если понадобится можно создавать другие базы данных для разных задач.


ORM и Core

В SQLAlchemy существуют два реализаций работы, Core и ORM. Core - абстракция над SQL-базой данных а ORM (Object Relational Mapper) mapping между реляционной БД и объектным представлением.

ORM разработан поверх SQLAlchemy-Core. Как мы можем видеть, базовая архитектура SQLAlchemy приведена ниже.

Зная SQL можно использовать Core для выполнения необработанных SQL-запросов. Остальным, лучше смотреть в сторону ORM.

В следующих примерах будет использоваться ORM реализацию SQLAlchemy


Примеры использований

pip install sqlalchemy

Подключение к базу данных

from sqlalchemy import create_engine 

# <dialect+driver>://<user>@<ip:port>/<database> 
engine = create_engine('postgresql://postgres:pass@localhost/postgres') 
engine.connect() 
print(engine)

Создания таблиц

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base

engine = create_engine('postgresql://postgres:pass@localhost/postgres') 
engine.connect()  # подключение к бд
# функция, которая создает базовый класс для декларативных классов
Base = declarative_base()


class User(Base):
    __tablename__ = "user"
    id = Column(Integer, primary_key=True)    
    name = Column(String)

    
Base.metadata.create_all(engine)  # создание всех таблиц

Основные операции SQL

from sqlalchemy import (    
    create_engine, Column, Integer, String, select, update
)
from sqlalchemy.orm import declarative_base, Session

engine = create_engine('postgresql://postgres:pass@localhost/postgres')
engine.connect()
Base = declarative_base()
session = Session(engine)

class User(Base):
    __tablename__ = "user"    
    id = Column(Integer, primary_key=True)    
    name = Column(String)
    
    
# SELECT
def selectUser():   
    result = session.execute(select(User))  # поиск всех данных с таблицы        
    for data in result.scalars():      
        print(f"id: {data.id} | name: {data.name}")
            
# INSERT
def addUser(id: int, name: str):
    session.add(User(id=id, name=name))  # добавление новых данных
    session.commit()
        
# DELETE by id
def deleteUser(id: int):          
    session.query(User).filter(User.id == id).delete()  # поиск и удаление ряда        
    session.commit()
        
# UPDATE name by id
def updateUser(id: int, new_name: str):
    session.execute(update(User).where(User.id == id).values(
            name=new_name))  # поиск и обновление значений
    session.commit()


if __name__ == '__main__':
    # Base.metadata.drop_all(engine)  # удаление таблиц     
    Base.metadata.create_all(engine)  # создание таблиц    
    addUser(id=1, name="name")    
    selectUser()    
    updateUser(id=1, new_name="new_name")    
    selectUser()    
    deleteUser(1)    
    selectUser()

Заключение

SQLAlchemy это удобная библиотека которая позволяет взаимодействовать с разными структуры баз данных без знания их самих. Кроме postgres можно использовать SQLite которая устанавливается проще, но хранит данные в файле, и для этого надо поменять строчку при подключение к бд. За исключением некоторых типов колонок, например, ARRAY, который есть только в постгресе, все типы можно импортировать из sqlalchemy.dialects что является преимуществом алхимии. Она сама заботится о составлении SQL запросов в зависимости от выбранной технологии.

Дополнительная информация:

https://pythonru.com/biblioteki/vvedenie-v-sqlalchemy

https://www.sqlalchemy.org/