diff --git a/sijapi/classes.py b/sijapi/classes.py index c2c6289..c6924f1 100644 --- a/sijapi/classes.py +++ b/sijapi/classes.py @@ -443,6 +443,45 @@ class APIConfig(BaseModel): END $$; """) + async def get_schema(self, pool_entry: Dict[str, Any]): + async with self.get_connection(pool_entry) as conn: + tables = await conn.fetch(""" + SELECT table_name, column_name, data_type, character_maximum_length, + is_nullable, column_default, ordinal_position + FROM information_schema.columns + WHERE table_schema = 'public' + ORDER BY table_name, ordinal_position + """) + + indexes = await conn.fetch(""" + SELECT indexname, indexdef + FROM pg_indexes + WHERE schemaname = 'public' + """) + + constraints = await conn.fetch(""" + SELECT conname, contype, conrelid::regclass::text as table_name, + pg_get_constraintdef(oid) as definition + FROM pg_constraint + WHERE connamespace = 'public'::regnamespace + """) + + return { + 'tables': tables, + 'indexes': indexes, + 'constraints': constraints + } + + async def create_sequence_if_not_exists(self, conn, sequence_name): + await conn.execute(f""" + DO $$ + BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_sequences WHERE schemaname = 'public' AND sequencename = '{sequence_name}') THEN + CREATE SEQUENCE {sequence_name}; + END IF; + END $$; + """) + async def apply_schema_changes(self, pool_entry: Dict[str, Any], source_schema, target_schema): async with self.get_connection(pool_entry) as conn: source_tables = {t['table_name']: t for t in source_schema['tables']}