Esempio n. 1
0
def sync(database):
    if os.getenv('HOSTINGENV') == 'DEV':
        db_url_format = 'postgresql://*****:*****@postgres:5432/%s'
    else:
        db_url_format = 'postgresql://*****:*****@/%s?host=/var/run/postgresql'
    temp_db_url = db_url_format % f'{database}temp'
    db_url = db_url_format % database
    with temp_db(temp_db_url) as s_target_temp:
        create_database(db_url)
        with S(db_url) as s_current, S(s_target_temp) as s_target:
            run_all(f'{database}/migrations', s_current)
            run_all(f'{database}/schemas', s_target)
            run_all(f'{database}/tables', s_target)
            m = Migration(s_current, s_target)
            m.set_safety(False)
            m.add_all_changes()

            if m.statements:
                print('THE FOLLOWING CHANGES ARE PENDING:', end='\n\n')
                print(m.sql)
                print()
                if (len(sys.argv) > 1 and sys.argv[1] == 'noconfirm') or input('Apply these changes? (y/n) ') == 'y':
                    print('Applying...')
                    m.apply()
                else:
                    print('Not applying.')
            else:
                print('Already synced.')
Esempio n. 2
0
def temp_db(url):
    try:
        # Drop if exists in case the previous deployment didn't clean up for some reason
        create_database(url, wipe_if_existing=True)
        yield url
    finally:
        drop_database(url)
Esempio n. 3
0
def temporary_database(base_uri):
    # Create temporary database
    tempname = temporary_name()
    temp_uri = copy_url(base_uri)
    temp_uri.database = tempname
    create_database(temp_uri)
    s = session(temp_uri)

    try:
        yield s
    except Exception:
        s.rollback()
        raise
    finally:
        s.close()
        drop_database(temp_uri)
Esempio n. 4
0
def sync(database):
    DB_URL = f'postgresql://*****:*****@postgres:5432/{database}'
    with temp_db(f'postgresql://*****:*****@postgres:5432/{database}temp') as TEMP_DB_URL:
        create_database(TEMP_DB_URL)
        create_database(DB_URL)
        with S(DB_URL) as s_current, S(TEMP_DB_URL) as s_target:
            run_all(f'{database}/schemas', s_target)
            run_all(f'{database}/tables', s_target)
            m = Migration(s_current, s_target)
            m.set_safety(False)
            m.add_all_changes()

            if m.statements:
                print('THE FOLLOWING CHANGES ARE PENDING:', end='\n\n')
                print(m.sql)
                print()
                if (len(sys.argv) > 1 and sys.argv[1] == 'noconfirm') or input('Apply these changes? (y/n) ') == 'y':
                    print('Applying...')
                    m.apply()
                else:
                    print('Not applying.')
            else:
                print('Already synced.')
Esempio n. 5
0
def test_createdrop(tmpdir):
    sqlite_path = str(tmpdir / "testonly.db")

    urls = [
        "postgresql:///sqlbag_testonly", "mysql+pymysql:///sqlbag_testonly"
    ]

    for db_url in urls:
        drop_database(db_url)
        assert not drop_database(db_url)
        assert not exists(db_url)
        assert create_database(db_url)
        assert exists(db_url)

        if db_url.startswith("postgres"):
            assert create_database(db_url,
                                   template="template1",
                                   wipe_if_existing=True)
        else:
            assert create_database(db_url, wipe_if_existing=True)
        assert exists(db_url)
        assert drop_database(db_url)
        assert not exists(db_url)

    db_url = "sqlite://"  # in-memory special case

    assert exists(db_url)
    assert not create_database(db_url)
    assert exists(db_url)
    assert not drop_database(db_url)
    assert exists(db_url)

    db_url = "sqlite:///" + sqlite_path

    assert not database_exists(db_url)
    # selecting works because sqlite auto-creates
    assert database_exists(db_url, test_can_select=True)
    drop_database(db_url)
    create_database(db_url)
    assert exists(db_url)

    drop_database(db_url)
    assert not database_exists(db_url)
    assert database_exists(db_url, test_can_select=True)

    with temporary_database("sqlite") as dburi:
        with S(dburi) as s:
            s.execute("select 1")
Esempio n. 6
0
def test_createdrop(tmpdir):
    sqlite_path = str(tmpdir / "testonly.db")

    urls = ["postgresql:///sqlbag_testonly", "mysql+pymysql:///sqlbag_testonly"]

    for db_url in urls:
        drop_database(db_url)
        assert not drop_database(db_url)
        assert not exists(db_url)
        assert create_database(db_url)
        assert exists(db_url)

        if db_url.startswith("postgres"):
            assert create_database(db_url, template="template1", wipe_if_existing=True)
        else:
            assert create_database(db_url, wipe_if_existing=True)
        assert exists(db_url)
        assert drop_database(db_url)
        assert not exists(db_url)

    db_url = "sqlite://"  # in-memory special case

    assert exists(db_url)
    assert not create_database(db_url)
    assert exists(db_url)
    assert not drop_database(db_url)
    assert exists(db_url)

    db_url = "sqlite:///" + sqlite_path

    assert not database_exists(db_url)
    # selecting works because sqlite auto-creates
    assert database_exists(db_url, test_can_select=True)
    drop_database(db_url)
    create_database(db_url)
    assert exists(db_url)

    drop_database(db_url)
    assert not database_exists(db_url)
    assert database_exists(db_url, test_can_select=True)

    with temporary_database("sqlite") as dburi:
        with S(dburi) as s:
            s.execute("select 1")
Esempio n. 7
0
def temp_db(url):
    try:
        create_database(url)
        yield url
    finally:
        drop_database(url)
Esempio n. 8
0
 def create_database(self, *args, **kwargs):
     create_database(self.db_url, *args, **kwargs)