Форум сайта python.su
Здравствуйте! Не могу никак понять - как получить значение генератора базы на 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
AS
BEGIN
IF (NEW.MID IS NULL) THEN
NEW.MID = GEN_ID(GEN_MANAGERS_ID,1); ##то-есть, имя генератора-GEN_MANAGERS_ID
END
Офлайн
Подсказка:
>>> from sqlalchemy import func
>>> f = func.gend_id(2, 1)
>>> str(f)
'gen_id(:gen_id_1, :gen_id_2)'
Офлайн
Хм… нашел скудную документацию про генератор функций. Наверное, не gend_id, а gen_id?
from sqlalchemy.sql import func
f = func.gen_id("GEN_MANAGERS_ID",1)
Офлайн
balooАга, опечатался.
Хм… нашел скудную документацию про генератор функций. Наверное, не gend_id, а gen_id?
balooСинтаксис вызова функций зависит от РСУБД. С FireBird дел не имел. Скажем, в PostgreSQL, это?from sqlalchemy.sql import func
f = func.gen_id("GEN_MANAGERS_ID",1)
Что-то не могу ее приспособить. Куда ее совать-то? Я там откопал sequence, может, это то, что надо?
Я понял, что func создает функцию, которая использовалась бы в базе данных, позволяющей использовать функции. А вот как ее использовать?
SELECT somefunc(arg1, arg2);
f = select(func.somefunc(arg1, arg2))
session.connection().execute(f)
somefunc(arg1, arg2);
f = func.somefunc(arg1, arg2)
session.connection().execute(f)
Отредактировано (Март 21, 2009 14:36:06)
Офлайн
Сработало следующее:
пишем фукнцию
#----------------------------------------------------------------------
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)
Офлайн
j2a
Спасибо, пригодилась подсказко
Офлайн
Круто, что сам разобрался. Я с sequence не работал…
Офлайн
Я, кстати, так до конца и не въехал, что этот func делает? В доках мутно написано.
Офлайн
func – это просто обертка для произвольной SQL-функции.
Офлайн
Прошу прощения, просто из любопытства, а зачем вам на клиенте знать значение генератора?
Офлайн