После неудачного эксперимента с бекапами база данных может содержать по несколько копий каждой строки таблицы, это приводит любой ORM в ступор, впрочем и руками удалить такие записи не полуться, так записи имеют одинаковые ID. Ниже решение как легко удалить дубли и оставить только по одной уникальной строке
table_name=auth_users
data_base=breys
echo "
begin;
select count(1) from $table_name ;
create table ttt as select distinct id x, * from $table_name ;
alter table ttt drop column x;
truncate table $table_name;
insert into $table_name (select * from ttt );
drop table ttt ;
select count(1) from $table_name ;
end;
" | psql $data_base
Суть метода такова:
- создать копию таблицы содержающую только уникальные по ID записи, для этого используется DISTINCT,
- затем нужно удалить сигнальное поле x
- почистить целевую таблицу
- затем перенести данные из временной таблицы в целевую
- удалить временную таблицу
Если необходимо обработать все таблицы базы данных то скрипт можно использовать в цикле
for table_name in $(echo '\dt' | psql $data_base | awk '{print $3}'| grep -v ^$|sort ); do
echo "
begin;
select count(1) from $table_name ;
create table ttt as select distinct id x, * from $table_name ;
alter table ttt drop column x;
truncate table $table_name;
insert into $table_name (select * from ttt );
drop table ttt ;
select count(1) from $table_name ;
end;
" | psql $data_base;
done
с помощь транзакций можно предовратить удаление данных в случае проблемного импорта