modern-sql.com
10 лет спустя 4го издания
Комментарии к академическим статьям по базам данных
Vietnam
of Computer Science
SQLAlchemy considers the database to be a relational algebra engine, not just a collection of tables.
представлена в 2005 году
автор: Michael Bayer
Data Definition Language
Запросы в базу данных
SELECT m.*
FROM chatmessage m
JOIN chatthread th ON m.threadid = th.threadid
JOIN chatvisitsession s ON th.visitsessionid = s.visitsessionid
WHERE m.kind NOT IN %s
AND s.visitorid = %s
AND floor(m.insertedts/1e6) > %s
AND th.state != %s
import sqlalchemy as sa
from webim.database import Chat, Message, VisitSession
def query():
kinds = sa.bindparam('kinds', expanding=True)
visitor_id = sa.bindparam('visitor_id')
time = sa.bindparam('time')
state = sa.bindparam('state')
join = sa.join(Message, Chat).join(VisitSession)
clause = Message.kind.notin_(kinds)
clause &= VisitSession.visitor_guid == visitor_id
clause &= sa.func.floor(Message.inserted_ts / 1e6) > time
clause &= Chat.state != state
return sa.select([Message], clause, from_obj=join)
enum, json, fts, array types, index types, function index
SQLAlchemy Recipes
+ polymorph mapper
Но не получаем ни каких артефактов в добавок
Нет классического active record паттерна, т.е нет:
Явный объект который создаешь когда хочешь,
а не на каждый запрос
session.add(user1) # insert session.delete(user2) # delete user3.name = 'new name' session.add(user3) # update
Связь без FK или FK без связи – это ОК
Способы загрузки отношений
Коллекции в том числе и создание
Момент загрузки
Отношения без PK
user = User('foo') user.dep = Department('bar') user.save() user.dep.save()
Превращаем строки таблицы в объекты
в т.ч из запросов core
session.query(User).filter(User.name == 'test')
У колонок переопределены многие операторы сравнений
(User.name == 'foo') | (User.name == 'bar')
В том числе любой доступный в базе и определять свои
User.id.op('#')(0xff) # bitwise xor postgresql
встроенного get_or_create нет и не будет
Поскольку он завязан на поведение определенного уровня изоляции READ COMMITTED
asyncio?