PyQt, SQLAlchemy - для чего нужны сессии? - PullRequest
1 голос
/ 19 января 2012

У меня есть этот класс, который я использую для создания и управления базой данных SQLIte:

def __init__(self, db_file = None, parent = None):

    self.db = None
    self.db_connection = None
    self.db_file = str(db_file)

def db_open(self):
    self.db = create_engine('sqlite:///' + self.db_file)
    self.db_connection = self.db.connect()

def db_close(self):
    self.db_connection.close()

def db_create_voltdrop(self):
    metadata = MetaData()

    tb_cable_brands = Table('cable_brands', metadata,
        Column('id', Integer, primary_key=True),
        Column('brand', String)
        )
    tb_cable_types = Table('cable_types', metadata,
        Column('id', Integer, primary_key=True),
        Column('brand_id', None, ForeignKey('cable_brands.id')),
        Column('type', String),
        Column('alpha', String)
        )
    tb_cable_data = Table('cable_data', metadata,
        Column('id', Integer, primary_key=True),
        Column('type_id', None, ForeignKey('cable_types.id')),
        Column('size', String),
        Column('resistance', Float)
        )
    metadata.create_all(self.db)

Я создаю экземпляр этого класса при открытии моего главного окна, использую БД и закрываю БД при выходе из программы.

Я только начал изучать SQLAlchemy. Этот код работает отлично. А потом я наткнулся на сеансы в SQLAlchemy, которые также используются для создания и управления базами данных. Какой способ лучше? Какое преимущество имеют сеансы по сравнению с вышеуказанным способом? Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 января 2012

Краткий ответ: для вашего примера (где create_all выдает DDL) это не очень важно (и я даже не уверен, поддерживает ли SA транзакции DDL), но всякий раз, когда вы добавляете / удаляете / изменяете/ запросить сами объекты, Сессии - это путь.См. Использование сессий для получения дополнительной информации.

Дополнительная информация: Технически следующее утверждение неверно: ... then I came across sessions in SQLAlchemy which are also *used to create and manage databases*.
Сессии не используются длясоздавать базы данных и управлять ими, а не предоставлять шаблон UnitOfWork для операций с базами данных.
Простое представление состоит в том, чтобы рассматривать сеансы как транзакции SQL: сеансы SA для объектов SA - это то же, что транзакции SQL для DML (данныемодификация) заявления.Ваш конкретный пример генерирует операторы DDL (определение данных), и многие РСУБД даже не поддерживают транзакции для DDL (вы не можете откатить оператор CREATE TABLE, но должны использовать DROP TABLE для отмены вашей работы).

2 голосов
/ 19 января 2012

Лучшая практика для управления сессиями - объявить ее в глобальной области видимости и использовать ее.

В документе, представленном в sqlalchemy, написано:

When you write your application, place the result of the sessionmaker() call at the global level. The resulting Session class, configured for your application, should then be used by the rest of the applcation as the source of new Session instances.

Итак, выдолжны создать в любой сессии уровня пакета.Вы можете сослаться по этой ссылке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...