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.')
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)
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)
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.')
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")
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")
def temp_db(url): try: create_database(url) yield url finally: drop_database(url)
def create_database(self, *args, **kwargs): create_database(self.db_url, *args, **kwargs)