SQL

Avant de pouvoir les utiliser, une définition de connexion SQL doit être déclarée dans Dashboard. Cela crée de manière transparente un pool de connexions en arrière-plan que votre code Python utilise.

L'accès aux bases de données SQL se fait par le biais de sessions SQLAlchemy et toutes les fonctionnalités prises en charge par SQLAlchemy sont disponibles pour les services Zato.

Indépendamment de la manière dont on accède à une base de données et du type de requêtes émises, il est toujours nécessaire de fermer un objet de session lorsqu'un service a fini de l'utiliser. Le plus simple est d'utiliser la fonction intégrée de Python contextlib.closing pour le faire.

Émission de requêtes SQL brutes

# -*- coding: utf-8 -*-

# stdlib
from contextlib import closing

# Zato
from zato.server.service import Service

class MyService(Service):

    def handle(self):

        # Always use templates and bind variables
        template = 'SELECT name FROM http_soap WHERE data_format=:data_format'
        parameters = {'data_format':'json'}

        with closing(self.outgoing.sql.get('my-conn').session()) as session:
            result = session.execute(template, parameters)
            for item in result:
                self.logger.info(item)
INFO - ('zato.security.wss.create.json',)
INFO - ('zato.http-soap.ping.json',)
INFO - ('zato.service.configure-request-response.json',)
INFO - ('zato.kvdb.data-dict.dictionary.get-key-list.json',)

Modèles SQLAlchemy

Étant donné que la bibliothèque SQL sous-jacente est SQLAlchemy, vos services peuvent utiliser toutes les fonctionnalités offertes par cette bibliothèque. Par exemple, il est possible d'utiliser son ORM ou ses modèles au lieu d'émettre des requêtes directement.

# -*- coding: utf-8 -*-

# stdlib
from contextlib import closing

# Zato
from zato.server.service import Service

# Your app
from sql_models import Client

class MyService(Service):

    def handle(self):

        with closing(self.outgoing.sql.get('my-conn').session()) as session:
            client = session.query(Client).\
                filter(Client.name = 'John Doe').\
                filter(Client.segment = 'ABC').\
                one()

            # Process the client selected from the database now ..
            pass

L'objet session est un objet de session SQLAlchemy pris dans un pool de connexion défini dans Dashboard - référez-vous à la documentation de SQLAlchemy pour savoir comment l'utiliser avec tout type de requête SQL.

Microsoft SQL Server (MS SQL)

Notez que les connexions MS SQL permettent uniquement d'invoquer des procédures stockées. Il n'est pas possible d'émettre d'autres types de requêtes SQL ni d'utiliser les modèles SQLAlchemy avec MS SQL.

Sujets connexes