sql >> Base de Datos >  >> RDS >> PostgreSQL

Creación de bases de datos en pruebas SQLAlchemy con PostgreSQL

Nariz El corredor de prueba admite setup_package() y teardown_package() métodos. Aquí hay un extracto de los documentos:

En mi aplicación tengo setup_package() que se parece más o menos a lo siguiente:

def _create_database():

    template_engine = sa.create_engine("postgres://[email protected]/postgres", echo=False)

    conn = template_engine.connect()
    conn = conn.execution_options(autocommit=False)
    conn.execute("ROLLBACK")
    try:
        conn.execute("DROP DATABASE %s" % DB_NAME)
    except sa.exc.ProgrammingError as e:
        # Could not drop the database, probably does not exist
        conn.execute("ROLLBACK")
    except sa.exc.OperationalError as e:
        # Could not drop database because it's being accessed by other users (psql prompt open?)
        conn.execute("ROLLBACK")

    conn.execute("CREATE DATABASE %s" % DB_NAME)
    conn.close()

    template_engine.dispose()


def setup_package():
    _create_database()

    engine = sa.create_engine("postgres://[email protected]/%s" % DB_NAME, echo=False)

    session = sa.orm.scoped_session(sa.orm.sessionmaker())
    session.configure(bind=engine)
    Base.metadata.bind = engine
    Base.metadata.create_all()


def teardown_package():
    # no need to do anything as the old database is dropped at the start of every run

Además, todas las clases de casos de prueba se subclasifican a partir de una clase base que, lo que es más importante, define un tearDown común método:

class BaseTest(unittest.TestCase):

    def setUp(self):
        # This makes things nicer if the previous test fails
        # - without this all subsequent tests fail
        self.tearDown()

        self.config = testing.setUp()

    def tearDown(self):
        testing.tearDown()
        session.expunge_all()
        session.rollback()

Las subclases a menudo anulan la base setUp , pero generalmente no es necesario anular tearDown - al revertir la transacción, se asegura de que la siguiente prueba comience en una base de datos completamente limpia.