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
Декларативное создание таблицы, класса и отображения одним заходом
использование 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)
Session = sessionmaker()
Session.configure(bind=engine) # Как только у вас появится engine
session = Session()
session = Session() vasiaUser = User("vasia", "Vasiliy Pypkin", "vasia2000") session.add(vasiaUser)