Presentar información de una base de datos relacional

Introducción

Demostración de como conectarse a una base de datos relacional desde una vista de Plone, utilizando SQLAlchemy y SQLite.

Requisitos previos

Se necesita tener instalada una base de datos relacional, incluyendo las librerías de desarrollo. En este ejemplo se utiliza SQLite. Necesitamos también el driver de SQL para Python y SQLAlchemy, que es una librería para generalizar y facilitar al acceso a diversas bases de datos.

Para este ejemplo, es necesario agregar los siguientes paquetes a la sección de eggs en el buildout:

eggs =
    ...
    SQLAlchemy
    zope.sqlalchemy
    pysqlite
    ...

Vista Python

Primero definimos una vista que se conectará a SQLite:

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker, relation
from zope.sqlalchemy import ZopeTransactionExtension
import transaction

from Products.Five import BrowserView
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile

TEST_DSN = 'sqlite:///usuarios.db'
Base = declarative_base()

class User(Base):
    __tablename__ = 'test_users'
    id = Column('id', Integer, primary_key=True)
    name = Column('name', String(50))
    addresses = relation("Address", backref="user")

class Address(Base):
    __tablename__ = 'test_addresses'
    id = Column('id', Integer, primary_key=True)
    email = Column('email', String(50))
    user_id = Column('user_id', Integer, ForeignKey('test_users.id'))

engine = create_engine(TEST_DSN, convert_unicode=True)
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
Session = scoped_session(sessionmaker(bind=engine,
                                      extension=ZopeTransactionExtension()
))
session = Session()
session.add(User(name='bob'))
session.add(User(name='joe'))
bob = session.query(User).all()[0]
bob.addresses.append(Address(email='bob@bob.bob'))
joe = session.query(User).all()[1]
bob.addresses.append(Address(email='joe@joe.joe'))
transaction.commit()

class DB(BrowserView):
    """
    Obtener usuarios de base de datos
    """

    template = ViewPageTemplateFile('db.pt')

    def __init__(self, context, request):
        self.context = context
        self.request = request

    def __call__(self):
        session = Session()
        self.users = session.query(User).all()
        return self.template()

Template ZPT

En el template de ZPT, simplemente presentamos las filas de datos:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      lang="en"
      metal:use-macro="here/main_template/macros/master"
      i18n:domain="plonetheme.cursoplone">
<body>
  <div metal:fill-slot="main">
    <div tal:condition="view/users|nothing">
      <table class="listing">
        <tr>
          <th>Usuario</th>
          <th>Email</th>
        </tr>
        <tr tal:repeat="user view/users">
          <td><p tal:content="user/name"></p></td>
          <td><p tal:repeat="address user/addresses"
                 tal:content="address/email"></p>
          </td>
        </tr>
      </table>
    </div>
  </div>
</body>
</html>

Configuración

La configuración de la vista es como sigue:

<browser:page
    for="*"
    name="db"
    class=".db.DB"
    permission="zope2.View"
/>

Referencia

los comentarios son proporcionados por Disqus

Editar este documento

El código fuente de este archivo esta hospedado en GitHub. Todos pueden actualizar y corregir errores en este documento con unos clic - sin necesidad de descargar.

  1. Vaya hacia el articulo Presentar información de una base de datos relacional en GitHub.
  2. Presione el botón Fork. Este creara su propia copia personal de la documentación.
  3. Edite los archivos usando el editor de texto de GitHub desde su navegador Web
  4. Rellene en la caja de texto Commit message al final de la pagina indicando por que usted realizo estos cambios. Presione el botón Propose file change próximo a ese cuando haya finalizado.
  5. Luego diríjase a la página Send a pull request (no será necesario rellenar ningún texto adicional). Sólo tiene que pulsar el botón Send pull request.
  6. Sus cambios serán consultados por un revisor dentro de la pestaña Pull requests del proyecto en Github.

Para mas información básica acerca de como actualizar este manual y referencia a sintaxis Sphinx, por favor consulte la guía Escribiendo y actualizando el manual.