sql >> Database >  >> RDS >> PostgreSQL

Databases maken in SQLAlchemy-tests met PostgreSQL

Neus testrunner ondersteunt setup_package() en teardown_package() methoden. Hier is een fragment uit de documenten:

In mijn applicatie heb ik setup_package() die er ongeveer als volgt uitziet:

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

Bovendien worden alle testcaseklassen gesubklasseerd van een basisklasse, die, belangrijker nog, een gemeenschappelijke tearDown definieert methode:

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()

Subklassen overschrijven vaak basis setUp , maar het is meestal niet nodig om tearDown te overschrijven - door de transactie terug te draaien zorgt het ervoor dat de volgende test start op een volledig schone database.




  1. substr werkt niet goed met utf8

  2. Foutrelatie bestaat niet

  3. BLOB-opslaglengte in orakel

  4. hoe u een MySql-query maakt om het lopende saldo van credit en debet weer te geven wanneer meerdere klanten individuele saldi hebben