Автор (ы) | Майкл Bayer |
---|---|
Первоначальный выпуск | 14 февраля 2006 г.; 14 лет назад (14 февраля 2006 г.) |
Стабильный выпуск | 1.3.19 / 17 августа 2020 г.; 57 дней назад (2020-08-17) |
Репозиторий | |
Написано на | Python |
Операционная система | Кросс-платформенный |
Тип | Объектно-реляционное сопоставление |
Лицензия | Лицензия MIT |
Веб-сайт | www.sqlalchemy.org |
SQLAlchemy - это открытый источник инструментарий SQL и объектно-реляционный преобразователь (ORM) для языка программирования Python. выпущен по лицензии MIT.
Философия SQLAlchemy заключается в том, что реляционные базы данных ведут себя не так, как коллекции объектов по мере увеличения масштаба и производительности, в то время как коллекции объектов ведут себя меньше как таблицы и строки, поскольку в них встроено больше абстракции. По этой причине он принял шаблон отображения данных (аналогичный Hibernate для Java ), а не шаблон активной записи, используемый ряд других объектно-реляционных картографов. Однако дополнительные плагины позволяют пользователям разрабатывать с использованием декларативного синтаксиса.
SQLAlchemy впервые был выпущен в феврале 2006 года и быстро стал одним из наиболее широко используемых инструментов объектно-реляционного сопоставления в Python. community, а также Django ORM.
В следующем примере представлена взаимосвязь n-to-1 между фильмами и их режиссерами. Показано, как определенные пользователем классы Python создают соответствующие таблицы базы данных, как экземпляры со связями создаются с обеих сторон связи и, наконец, как данные могут быть запрошены - на примере автоматически сгенерированного SQL запросы как для отложенной, так и для активной загрузки.
Создание двух классов Python и соответствующих таблиц базы данных в СУБД:
из импорта sqlalchemy * из sqlalchemy.ext. Декларативный импорт declarative_base из отношения импорта sqlalchemy.orm, база создателя сеансов = declarative_base () class Movie (Base): __tablename__ = "movies" id = Column (Integer, primary_key = True) title = Column (String (255), nullable = False) year = Column (Integer) visible_by = Column (Integer, ForeignKey ("directors.id")) Director = Relations ("Director", backref = "movies", lazy = False) def __init __ (self, title = None, year = None): self.title = title self.year = year def __repr __ (self): return "Movie (% r,% r,% r)"% (self.title, self.year, self.director) class Director (Base): __tablename__ = "directors" id = Column ( Целое число, primary_key = True) name = Column (String (50), nullable = False, unique = True) def __init __ (self, name = None): self.name = name def __repr __ (self): return "Director (% r) "% (self.name) engine = create_engine (" dbms: // user: pwd @ host / d bname ") Base.metadata.create_all (engine)
Можно вставить отношение режиссер-фильм через любой объект:
Session = sessionmaker (bind = engine) session = Session () m1 = Фильм ("Робокоп", 1987) m1.director = Режиссер ("Пол Верховен") d2 = Режиссер ("Джордж Лукас") d2.movies = [Фильм ("Звездные войны", 1977), Фильм ("THX 1138 ", 1971)] try: session.add (m1) session.add (d2) session.commit () except: session.rollback ()
alldata = session.query (Movie).all () для некоторых данных в alldata: print (somedata)
SQLAlchemy выдает следующий запрос к СУБД (без псевдонимов):
SELECT movies.id, movies.title, movies.year, movies.directed_by, directors.id, directors.name FROM movies LEFT OUTER JOIN режиссеры ON directors.id = movies.directed_by
Результат:
Movie ('Robocop', 1987L, Director ('Paul Verhoeven')) Movie ('Star Wars', 1977L, Режиссер ('Джордж Лукас')) Фильм ('THX 1138', 1971L, Режиссер ('Джордж Лукас'))
Настройка lazy = True
(по умолчанию) вместо этого SQLAlchemy сначала отправит запрос для получения списка фильмов и только при необходимости (ленивый) для каждого режиссера запрос для получения имени соответствующего режиссера:
SELECT movies.id, movies.title, movies.year, movies.directed_by FROM movies SELECT directors.id, directors.name FROM directors WHERE directors.id =% s