Уведомления

Группа в Telegram: @pythonsu

#1 Март 21, 2009 07:46:55

baloo
От:
Зарегистрирован: 2008-05-13
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy+FireBird : как получить текущее значение генератора?

Здравствуйте! Не могу никак понять - как получить значение генератора базы на 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 пустым. Как мне запросить у базы значение генератора, чтобы скормить его контроллеру? Спасибо



Офлайн

#2 Март 21, 2009 10:50:25

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

SQLAlchemy+FireBird : как получить текущее значение генератора?

Подсказка:

>>> from sqlalchemy import func
>>> f = func.gend_id(2, 1)
>>> str(f)
'gen_id(:gen_id_1, :gen_id_2)'



Офлайн

#3 Март 21, 2009 13:41:54

baloo
От:
Зарегистрирован: 2008-05-13
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy+FireBird : как получить текущее значение генератора?

Хм… нашел скудную документацию про генератор функций. Наверное, не gend_id, а gen_id?

        from sqlalchemy.sql import func
f = func.gen_id("GEN_MANAGERS_ID",1)
?
Что-то не могу ее приспособить. Куда ее совать-то? Я там откопал sequence, может, это то, что надо?
Я понял, что func создает функцию, которая использовалась бы в базе данных, позволяющей использовать функции. А вот как ее использовать?



Офлайн

#4 Март 21, 2009 14:34:30

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

SQLAlchemy+FireBird : как получить текущее значение генератора?

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)



Отредактировано (Март 21, 2009 14:36:06)

Офлайн

#5 Март 22, 2009 08:28:49

baloo
От:
Зарегистрирован: 2008-05-13
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy+FireBird : как получить текущее значение генератора?

Сработало следующее:
пишем фукнцию

#----------------------------------------------------------------------
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)



Офлайн

#6 Март 22, 2009 08:30:15

baloo
От:
Зарегистрирован: 2008-05-13
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy+FireBird : как получить текущее значение генератора?

j2a
Спасибо, пригодилась подсказко



Офлайн

#7 Март 22, 2009 10:49:34

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

SQLAlchemy+FireBird : как получить текущее значение генератора?

Круто, что сам разобрался. Я с sequence не работал…



Офлайн

#8 Март 22, 2009 12:32:50

baloo
От:
Зарегистрирован: 2008-05-13
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy+FireBird : как получить текущее значение генератора?

Я, кстати, так до конца и не въехал, что этот func делает? В доках мутно написано.



Офлайн

#9 Март 22, 2009 17:51:27

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

SQLAlchemy+FireBird : как получить текущее значение генератора?

func – это просто обертка для произвольной SQL-функции.



Офлайн

#10 Март 23, 2009 05:36:41

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

SQLAlchemy+FireBird : как получить текущее значение генератора?

Прошу прощения, просто из любопытства, а зачем вам на клиенте знать значение генератора?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version