For alle, der ender her og leder efter, hvordan man sletter tabelpartitionerne i PostgreSQL, her er det moderne svar.
Løsningen er ikke at bruge en DELETE-sætning, fordi det vil slette dataene uden at droppe de tilsvarende tabelpartitioner, der indeholdt dataene. OP spurgte om håndtering af partitionstabeller, ikke sletning af poster, så enhver løsning, der bruger DELETE-sætninger, tilføjer unødvendige databaseoverhead for sletning af poster, efterlader tomme partitionstabeller på plads og ignorerer fuldstændig en af de primære fordele ved at bruge partitionering; Sænker bordet, når det ikke længere er nyttigt.
I dette tilfælde må løsningen være at DROP den ikke længere nødvendige partitionstabel. Jeg har skrevet en løsning til at løse dette problem i mit produktionsmiljø, svaret er her .
For at løse OP's problem kan den funktion, jeg skrev, bruges med to små revisioner til at ændre fuldt tabelnavn variabel og datoformat. Den fulde tabelnavn-variabellinje skal ændres fra
fullTablename := base_table_name || '_' || to_char(startTime, dateFormat);
til ÅÅÅÅ-MM-DD_log-formatet som dette
fullTablename := to_char(startTime, dateFormat) || '_' || base_table_name;
Så skal datoformatet ændres lidt fra
WHEN partition_plan='day' THEN 'YYYYDDD'
til den angivne tabelnavnekonvention
WHEN partition_plan='day' THEN 'YYYY-MM-DD'
Så kan SQL-forespørgslen, der kalder funktionen til at udføre oprydningen, kaldes fra et dagligt vedligeholdelsesscript som dette:
SELECT public.drop_partitions(current_date-180, 'public', 'log', 5, 'day');
Hvilket vil DROPPE ÅÅÅÅ-MM-DD_log-tabellerne, der er 5 dage ældre end 180 dage siden. For en indledende kørsel for at slette snesevis eller hundredvis af gamle tabelpartitioner, skal 5 kan indstilles til en meget højere værdi, der opnår den ønskede effekt.