Skip to main content

SQLAlchemy/Zope2 transaction integration

Project description

Introduction

The lead part of the alchemist’s toolkit.

Yes, it’s Yet Another SQLAlchemy/Zope Integration Package. I’m sorry, I really am. Many thanks to Andreas Jung for z3c.sqlalchemy and Kapil Thangavelu for ore.alchemist. I borrowed the Zope transaction data manager code from Andreas who borrowed it from Kapil, I believe.

The purpose of this package is to be the lead part and the lead part only. The gold-making bit is left to SQLAlchemy. That means that are no abstractions or lazy initialisaion or table auto-detection for building SQLAlchemy table metadata and mappers, no generation of Zope 3 interfaces, no CRUD operations, and no dancing polar bears.

You need to understand SQLAlchemy for this package and this README to make any sense. See http://sqlalchemy.org/docs/.

Please note that this package is only meant to be used as a tool in other packages; you can not install it directly in a Zope site.

The use case

  • You want SQLAlchemy

  • You want to look up database connections/sessions as named utilities

  • You want to use simple domain/mapper classes, with no particular dependencies

  • You don’t want to worry about transaction and connection handling

  • You want to be able to configure SQL connection parameters at run-time, e.g. in the ZODB. Well, you don’t have to, but it’s nice to have the option.

What you have to do

Let’s say we had some domain classes TableOne and TableTwo, relating to tables table1 and table2.

>>> class TableOne(object):
...     pass
>>> class TableTwo(object):
...     pass

You are supposed to subclass collective.lead.Database, fill in its template methods, and then register the new class as a global, non-persistent named utility providing IDatabase.

>>> from collective.lead import Database
>>> import sqlalchemy as sa
>>> class MyDatabase(Database):
...     @property
...     def _url(self):
...         return sa.engine.url.URL(drivername='mysql', username='user',
...                    host='localhost',  database='testdb')
...
...     def _setup_tables(self, metadata, tables):
...         tables['table1'] = sa.Table('table1', metadata, autoload=True)
...         tables['table2'] = sa.Table('table2', metadata, autoload=True)
...
...     def _setup_mappers(self, tables, mappers):
...         mappers['table1'] = sa.mapper(TableOne, tables['table1'])
...         mappers['table2'] = sa.mapper(TableTwo, tables['table2'],
...                                         properties = {
...                                             'table1' : sa.relation(TableOne),
...                                             })

The database utility can now be registered using zcml:

<utility

provides=”collective.lead.interfaces.IDatabase” factory=”.database.MyDatabase” name=”my.database” />

or if you prefer directly from python (XXX this does not work):

>>> from zope.component import provideUtility
>>> from collective.lead.interfaces import IDatabase
>>> provideUtility(MyDatabase, name='my.database', provides=IDatabase)

Using the database connection

In application code, you can now get a database engine by name. This engine is threadlocal, and contains a single, cached session. When it is first requested, a new transaction will be begun. This is joined to a Zope transaction, and will commit or roll back as appropriate when the request ends. Or, in other words, it should work more or less as you’d expect and you should not need to worry about transactions (neither Zope nor SQL ones).

>>> from zope.component import getUtility
>>> db = getUtility(IDatabase, name='my.database')
>>> db.session.query(TableOne).list()
[]
>>> db.connection.execute("SELECT * FROM table1")

Changelog

1.0 - unreleased

  • Initial release [optilude]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

collective.lead-1.0.tar.gz (12.5 kB view details)

Uploaded Source

Built Distributions

collective.lead-1.0-py2.5.egg (18.9 kB view details)

Uploaded Source

collective.lead-1.0-py2.4.egg (18.9 kB view details)

Uploaded Source

File details

Details for the file collective.lead-1.0.tar.gz.

File metadata

File hashes

Hashes for collective.lead-1.0.tar.gz
Algorithm Hash digest
SHA256 1c0d15c0e58464d366a385045abab6a140a6c1c9c8092fc246b508cfc411fa3b
MD5 141ff4e636dc6d7484faf7b3859e21c9
BLAKE2b-256 104dcda769165d73db62465ff86e715b1b720514a227aa6060e3ab5403e714c2

See more details on using hashes here.

File details

Details for the file collective.lead-1.0-py2.5.egg.

File metadata

File hashes

Hashes for collective.lead-1.0-py2.5.egg
Algorithm Hash digest
SHA256 da5ca3912a72943282f7bf41351762cc67ca7e9ef96634bee7e9ec2455717b6a
MD5 89aa46212909d108ab764f297477bfaf
BLAKE2b-256 550f2915f01ac154b4884d734f6bc3ac600f21d852f6a98edca38eeb0bf11138

See more details on using hashes here.

File details

Details for the file collective.lead-1.0-py2.4.egg.

File metadata

File hashes

Hashes for collective.lead-1.0-py2.4.egg
Algorithm Hash digest
SHA256 01ae5271cea0d1397a8948f07768fea21cbe1e1bbf0567bcd09249ea375e55a8
MD5 f634165e7b3ec0a12fef0da6a3bc8875
BLAKE2b-256 c463aa1e3b29fbfe370a25133a2f1cc22958877d16fff2dbae87fda73ef171a5

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page