複数の trac 管理

皆様どうやっているのかよくわからないので、とりあえず SQLite から無理矢理引っ張り出すことにしました。

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///trac.db', echo=False)
metadata = MetaData()
metadata.bind = engine

ticket_table = Table('ticket', metadata,
    Column('id', Integer, primary_key=True),
    Column('type', Text),
    Column('time', Integer, index=True),
    Column('changetime', Integer),
    Column('component', Text),
    Column('severity', Text),
    Column('priority', Text),
    Column('owner', Text),
    Column('reporter', Text),
    Column('cc', Text),
    Column('version', Text),
    Column('milestone', Text),
    Column('status', Text, index=True),
    Column('resolution', Text),
    Column('summary', Text),
    Column('description', Text),
    Column('keywords', Text))

ticket_change_table = Table('ticket_change', metadata,
    Column('ticket', Integer, ForeignKey('ticket.id'), primary_key=True, index=True),
    Column('time', Integer, primary_key=True, index=True),
    Column('author', Text),
    Column('field', Text, primary_key=True),
    Column('oldvalue', Text),
    Column('newvalue', Text))

class Ticket(object):
  pass

class TicketChange(object):
  pass

mapper(Ticket, ticket_table, properties={
  'ticket_change': relation(TicketChange)
})
mapper(TicketChange, ticket_change_table)

if __name__ == '__main__':
  assert 'ticket' in metadata.tables
  assert 'ticket_change' in metadata.tables

  # create ticket
  from trac import env, ticket
  env_path = '/home/trac/test'
  e = env.open_environment(env_path)
  db = e.get_db_cnx()
  t = ticket.Ticket(e, db=db)
  t['status'] = 'new'
  t['reporter'] = 'voluntas'
  t['owner'] = 'mitszo'
  t.insert(db=db)
  db.commit()
  t.save_changes(author='voluntas', comment='test')

  session = sessionmaker(bind=engine)()
  ticket = session.query(Ticket).first()
  assert ticket.reporter == 'voluntas'
  session.query(Ticket).filter(Ticket.reporter=='voluntas').count()
  session.query(TicketChange).all()
  ticket.ticket_change

Trac クラスを作ってコンストラクタで Path を渡すようにしてしまえばいいのだろうか ... 。
いい方法が実はすでにあるという罠な気がしてきた。