Найти - Пользователи
Полная версия: SQLAlchemy+FireBird : как получить текущее значение генератора?
Начало » Базы данных » SQLAlchemy+FireBird : как получить текущее значение генератора?
1 2
baloo
Здравствуйте! Не могу никак понять - как получить значение генератора базы на FireBird?
Pylons 0.9.7, SQLAlhemy 0.5.2

Вот модуль модели:
"""The application's model objects"""

import sqlalchemy as sa
from sqlalchemy import orm
from sqlalchemy import types
from pyfield.model import meta

def init_model(engine):
#global engine, Session
sm = orm.sessionmaker(autoflush=True, transactional=True, bind=engine)

meta.engine = engine
meta.Session = orm.scoped_session(sm)
#orm.mapper=
"""Call me before using any of the tables or classes in the model"""
## Reflected tables must be defined and mapped here
global reflected_insured
reflected_insured = sa.Table("INSURED", meta.metadata, autoload=True,
autoload_with= meta.engine)
orm.mapper(Insured, reflected_insured)

global reflected_managers
reflected_managers = sa.Table("MANAGERS", meta.metadata, autoload=True,
autoload_with = meta.engine)
orm.mapper(Managers, reflected_managers)

########################################################################
class Insured(object):
#----------------------------------------------------------------------
def __str(self):
return self.title

class Managers(object):
#----------------------------------------------------------------------
def __str(self):
return self.title
Вообще база сложная, сделанная давно. Сейчас перевожу клиента FireBird с Delphi на Pylons. Это только начало пути. В таблице Managers 2 поля: “mid” и “post_name”. Поле mid в базе заполняется стандартным триггером, из генератора:
AS
BEGIN
IF (NEW.MID IS NULL) THEN
NEW.MID = GEN_ID(GEN_MANAGERS_ID,1); ##то-есть, имя генератора-GEN_MANAGERS_ID
END
При попытке добавить новую запись Pylons вылетает с ошибкой, если мы оставили поле MID пустым. Как мне запросить у базы значение генератора, чтобы скормить его контроллеру? Спасибо
j2a
Подсказка:
>>> from sqlalchemy import func
>>> f = func.gend_id(2, 1)
>>> str(f)
'gen_id(:gen_id_1, :gen_id_2)'
baloo
Хм… нашел скудную документацию про генератор функций. Наверное, не gend_id, а gen_id?
        from sqlalchemy.sql import func
f = func.gen_id("GEN_MANAGERS_ID",1)
?
Что-то не могу ее приспособить. Куда ее совать-то? Я там откопал sequence, может, это то, что надо?
Я понял, что func создает функцию, которая использовалась бы в базе данных, позволяющей использовать функции. А вот как ее использовать?
j2a
baloo
Хм… нашел скудную документацию про генератор функций. Наверное, не gend_id, а gen_id?
Ага, опечатался.
baloo
        from sqlalchemy.sql import func
f = func.gen_id("GEN_MANAGERS_ID",1)
?
Что-то не могу ее приспособить. Куда ее совать-то? Я там откопал sequence, может, это то, что надо?
Я понял, что func создает функцию, которая использовалась бы в базе данных, позволяющей использовать функции. А вот как ее использовать?
Синтаксис вызова функций зависит от РСУБД. С FireBird дел не имел. Скажем, в PostgreSQL, это
SELECT somefunc(arg1, arg2);
так что в SQLAlchemy это будет выглядеть примерно так:
f = select(func.somefunc(arg1, arg2))
session.connection().execute(f)
если в SQL нужно просто
somefunc(arg1, arg2);
то
f = func.somefunc(arg1, arg2)
session.connection().execute(f)
baloo
Сработало следующее:
пишем фукнцию
#----------------------------------------------------------------------
def nextid(gen_name):
"""Get next value of generator 'GEN_NAME'"""
seq = sa.schema.Sequence(gen_name)
next_id = meta.engine.execute(seq)
return next_id
И вызываем ее из контроллера:
    def index(self): 
n_id = nextid("GEN_MANAGERS_ID")
return str(n_id)
baloo
j2a
Спасибо, пригодилась подсказко
j2a
Круто, что сам разобрался. Я с sequence не работал…
baloo
Я, кстати, так до конца и не въехал, что этот func делает? В доках мутно написано.
j2a
func – это просто обертка для произвольной SQL-функции.
PooH
Прошу прощения, просто из любопытства, а зачем вам на клиенте знать значение генератора?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB