Пример #1
0
def DDL(statement, when=None, obj=None, bind=None, dialect=None, context=None):
    """
    Construit un objet de type DDL en utilisant l'API
    correspondant à la version de SQLAlchemy en cours
    d'utilisation.

    Cette fonction peut être utilisée pour exécuter
    une commande SQL de deux manières distinctes.
    -   Soit lorsqu'un événement se produit (par exemple,
        lors de la création d'une certaine table du modèle),
        en passant les paramètres when et obj.
    -   Soit immédiatement en ne passant que le paramètre bind.
    Ces deux cas d'usage sont mutuellement exclusifs.

    @param statement: Commande SQL à exécuter touchant au
        schéma de la base (et donc, utilisant le DDL).
    @type statement: C{str}
    @param when: Nom de l'événement à attendre pour exécuter
        le DDL, par exemple "before-create".
    @type when: C{str}
    @param obj: Objet support du DDL à exécuter (généralement
        une Table).
    @param bind: Connexion à la base de données (Session ou Metadata),
        dans le cas où le DDL doit être exécuté immédiatement.
    @param dialect: Nom d'un dialecte SQL supporté par SQLAlchemy.
        Le DDL ne sera exécuté que si le dialecte utilisé par la
        base de données correspond à donné ici.
    @type dialect: C{str}
    @param context: Contexte qui sera passé au DDL (interpolé)
        au moment de son exécution.
    @type context: C{dict}
    """
    # 2 cas d'utilisation exclusifs :
    # - soit lorsqu'un événement se produit
    # - soit en exécution immédiate
    assert (bind is None or when is not None) or \
           (bind is not None or when is None)
    if context is None:
        context = {}

    # SQLAlchemy 0.5/0.6.
    if SaEvent is None:
        # Les dialectes "postgres" et "postgresql" sont définis
        # comme des aliases l'un par rapport à l'autre (sha:7d7d6c2).
        # On doit supporter le passage de l'un ou l'autre des noms.
        if dialect in ('postgres', 'postresql'):
            dialect = ('postgres', 'postgresql')
        if isinstance(dialect, (list, tuple)):
            # @HACK: Dans SQLAlchemy 0.5.x, seulement 3 arguments
            # positionnels sont passés : event, target & bind.
            # Dans SQLAlchemy 0.6.x, il y en a 4 : self, event, target & bind.
            # On ne s'intéresse qu'à bind (dernier argument à chaque fois).
            condition = lambda *args, **kwargs: args[-1].engine.name in dialect
        else:
            condition = dialect
        ddl = SaDDL(statement, on=condition, context=context)
        if when is None:
            ddl.execute(bind)
        else:
            # Les mots dans le nom de l'événement sont séparés par
            # des '-' dans cette version de SQLAlchemy.
            ddl.execute_at(when.replace('_', '-'), obj)
    # SQLAlchemy 0.7+
    else:
        ddl = SaDDL(statement, context=context)
        if when is None:
            ddl.execute(bind)
        else:
            # Les mots dans le nom de l'événement sont séparés par
            # des '_' dans cette version de SQLAlchemy.
            SaEvent.listen(obj, when.replace('-', '_'),
                         ddl.execute_if(dialect=dialect))
Пример #2
0
            # A modifier already on a request is being voided
            direction = Decimal(-1)
        if isinstance(modifier, AbsoluteModifier):
            absolute += direction * modifier.value
        elif isinstance(modifier, RelativeModifier):
            relative += direction * modifier.value
        payout = (srp_request.base_payout + absolute) * \
                (Decimal(1) + relative)
        srp_request.payout = PrettyDecimal(payout)


# The next few lines are responsible for adding a full text search index on the
# Request.details column for MySQL.
_create_fts = DDL('CREATE FULLTEXT INDEX ix_%(table)s_details_fulltext '
                       'ON %(table)s (details);')
_drop_fts = DDL('DROP INDEX ix_%(table)s_details_fulltext ON %(table)s')


event.listen(
        Request.__table__,
        'after_create',
        _create_fts.execute_if(dialect='mysql')
)


event.listen(
        Request.__table__,
        'before_drop',
        _drop_fts.execute_if(dialect='mysql')
)
Пример #3
0
            # A modifier already on a request is being voided
            direction = Decimal(-1)
        if isinstance(modifier, AbsoluteModifier):
            absolute += direction * modifier.value
        elif isinstance(modifier, RelativeModifier):
            relative += direction * modifier.value
        payout = (srp_request.base_payout + absolute) * \
                (Decimal(1) + relative)
        srp_request.payout = PrettyDecimal(payout)


# The next few lines are responsible for adding a full text search index on the
# Request.details column for MySQL.
_create_fts = DDL('CREATE FULLTEXT INDEX ix_%(table)s_details_fulltext '
                       'ON %(table)s (details);')
_drop_fts = DDL('DROP INDEX ix_%(table)s_details_fulltext ON %(table)s')


event.listen(
        Request.__table__,
        'after_create',
        _create_fts.execute_if(dialect='mysql')
)


event.listen(
        Request.__table__,
        'before_drop',
        _drop_fts.execute_if(dialect='mysql')
)
Пример #4
0
            relative = Decimal(0)
        # The modifier that's changed isn't reflected yet in the database, so we
        # apply it here.
        if isinstance(value, Request):
            # A modifier being added to the Request
            if modifier.voided:
                # The modifier being added is already void
                return
            direction = Decimal(1)
        else:
            # A modifier already on a request is being voided
            direction = Decimal(-1)
        if isinstance(modifier, AbsoluteModifier):
            absolute += direction * modifier.value
        elif isinstance(modifier, RelativeModifier):
            relative += direction * modifier.value
        payout = (srp_request.base_payout + absolute) * (Decimal(1) + relative)
        srp_request.payout = PrettyDecimal(payout)


# The next few lines are responsible for adding a full text search index on the
# Request.details column for MySQL.
_create_fts = DDL("CREATE FULLTEXT INDEX ix_%(table)s_details_fulltext " "ON %(table)s (details);")
_drop_fts = DDL("DROP INDEX ix_%(table)s_details_fulltext ON %(table)s")


event.listen(Request.__table__, "after_create", _create_fts.execute_if(dialect="mysql"))


event.listen(Request.__table__, "before_drop", _drop_fts.execute_if(dialect="mysql"))