annot-server/database.py
author ymh <ymh.work@gmail.com>
Sat, 25 Oct 2014 06:44:33 +0200
changeset 67 7db9c7ec691a
parent 22 986ee928a866
permissions -rw-r--r--
correct getting duration from content. try to improve error management
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
#
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
# See LICENCE for detail
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
# Copyright (c) 2014 IRI
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
#
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
from sqlalchemy import create_engine, MetaData
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
from sqlalchemy.orm import scoped_session, sessionmaker
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
from sqlalchemy.ext.declarative import declarative_base
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
import psycopg2.extras
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
from twisted.python import log
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
from txpostgres.txpostgres import Connection, ConnectionPool
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
import config
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
engine = create_engine(config.CONN_STR, convert_unicode=True)
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
db_session = scoped_session(sessionmaker(autocommit=False,
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
                                         autoflush=False,
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
                                         bind=engine))
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
Base = declarative_base()
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
Base.query = db_session.query_property()
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
def init_db():
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    # import all modules here that might define models so that
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    # they will be registered properly on the metadata.  Otherwise
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    # you will have to import them first before calling init_db()
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    import models
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    Base.metadata.create_all(bind=engine)
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
class DictConnection(Connection):
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    @staticmethod
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    def connectionFactory(*args, **kwargs):
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
        kwargs['connection_factory'] = psycopg2.extras.DictConnection
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
        return psycopg2.connect(*args, **kwargs)
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
class DictConnectionPool(ConnectionPool):
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    connectionFactory = DictConnection
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
def create_connection_pool(conn_string):
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    created_connection_pool = DictConnectionPool(None, conn_string)
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    d = created_connection_pool.start()
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
    d.addErrback(log.err)
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
986ee928a866 add sqlalchemy model + put create module for webapp
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
    return created_connection_pool, d