SQLAlchemy — старт

SQLAlchemy — ORM приблуда Python/базы данных, позволяет описывать структуры БД  и способы взаимодействия с ней непосредственно на Питоне

Установка:

# easy_install SQLAlchemy

или так:

# pip install  --pre SQLAlchemy

проверим что получилось:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sqlalchemy
print ("Версия SQLAlchemy:", sqlalchemy.__version__)

выдает «Версия SQLAlchemy: 1.1.4»

значит работает

пробуем дальше:

from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:', echo=True)

echo=True  — включает ведение лога. весьма надо сказать полезная функция при отладке

дальше сделаем таблу:

from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
metadata = MetaData()
users_table = Table('users', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String),
    Column('fullname', String),
    Column('password', String)
)

чертовски все похоже на обычный SQL

далее, чтоб все это реализовалось:

metadata.create_all(engine)

запускаем скрипт — в консоль выдает:

…………

Версия SQLAlchemy: 1.1.4

2016-11-29 15:07:30,254 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1

2016-11-29 15:07:30,255 INFO sqlalchemy.engine.base.Engine ()

2016-11-29 15:07:30,255 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1

2016-11-29 15:07:30,255 INFO sqlalchemy.engine.base.Engine ()

2016-11-29 15:07:30,256 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users")

2016-11-29 15:07:30,256 INFO sqlalchemy.engine.base.Engine ()

2016-11-29 15:07:30,257 INFO sqlalchemy.engine.base.Engine

CREATE TABLE users (
id INTEGER NOT NULL,
name VARCHAR,
fullname VARCHAR,
password VARCHAR,
PRIMARY KEY (id)
)

2016-11-29 15:07:30,257 INFO sqlalchemy.engine.base.Engine ()
2016-11-29 15:07:30,257 INFO sqlalchemy.engine.base.Engine COMMIT

Process finished with exit code 0

уже хорошо

Из фич — при создании таблицы SQLAlchemy проверяет есть ли такая табла, то есть при повторном запуске скрипта ошибки не будет

Идем дальше

Определяем класс Python для отображения в таблицу

class User(object):
    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password
    def __repr__(self):
        return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)

__init__ — это конструктор, __repr__ же вызывается при операторе print. Они определены здесь для удобства. Они не обязательны и могут иметь любую форму. SQLAlchemy не вызывает __init__ напрямую

Настройка отображения

сольем в едином порыве таблицу user_table и класс User

from sqlalchemy.orm import mapper
mapper(User, users_table)

Функция mapper() создаст новый Mapper-объект и сохранит его для дальнейшего применения, ассоциирующегося с нашим классом. Теперь создадим и проверим объект типа User:

(python3)

print(mapper(User, users_table))
user = User("Вася", "Василий", "qweasdzxc")
print (user)
print (user.id)

выдаст:

Mapper|User|users
<User('Вася','Василий', 'qweasdzxc')>
None
user.id не был объявлен при определении класса, но тем не менее он все равно существует, потому как этот самый id определен собственно в таблице
на текущий момент его значение — None, потому как в БД мы его еще не кидали
как кинем  — будет какое-то но значение

Декларативное создание таблицы, класса и отображения одним заходом

использование mapper() — классический пример испозования SQLAlchemy, «мухи отдельно  — котлеты отдельно»

можно сделать то же самое, но попроще.

объявление класса и связь его с таблицей:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    password = Column(String)
    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password

    def __repr__(self):
        return "<User('%s','%s','%s')>" % (self.name, self.fullname, self.password)

функция declarative_base(), что определяет новый класс, который мы назвали Base, от которого будет унаследованы все наши ORM-классы. Обратите внимание: мы определили объекты Column безо всякой строки имени, так как она будет выведена из имени своего атрибута. Низлежащий объект Table, что создан нашей declarative_base() версией User, доступен через атрибут __table__

users_table = User.__table__

Имющиеся метаданные MetaData также доступны:

metadata = Base.metadata

Создаем сессию

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
В случае же, если наше приложение не имеет Engine-объекта базы данных, можно просто сделать так:
Session = sessionmaker()
А потом, когда вы создадите подключение к базе с помощью create_engine(), соедините его с сессией, используя configure():
Session.configure(bind=engine)  # Как только у вас появится engine
Такой класс Session будет создавать Session-объекты, которые привязаны к нашей базе.
теперь, когда вам необходимо общение с базой, вы создаете объект класса Session:
session = Session()
Добавление новых объектов
Чтобы сохранить наш User-объект, нужно добавить его к нашей сессии, вызвав add():
session = Session()


vasiaUser = User("vasia", "Vasiliy Pypkin", "vasia2000")
session.add(vasiaUser)
Этот объект будет находиться в ожидании сохранения, никакого SQL-запроса пока послано не будет. Сессия пошлет SQL-запрос, чтобы сохранить Васю, как только это понадобится, используя процесс сброса на диск(flush). Если мы запросим Васю из базы, то сначала вся ожидающая информация будет сброшена в базу, а запрос последует потом.
Для примера, ниже мы создадим новый объект запроса (Query), который загружает User-объекты. Мы «отфильтровываем» по атрибуту «имя=Вася» и говорим, что нам нужен только первый результат из всего списка строк. Возвращается тот User, который равен добавленному:
Более популярно:
Более подробно:
и еще более подробно:

Добавить комментарий