То, что вы смотрите, называется расстоянием редактирования, и вот приятное объяснение на wiki . Существует множество способов определения расстояния между двумя словами и желаемого, которое называется расстоянием Левенштейна, и здесь реализована реализация DP в python.
def levenshteinDistance(s1, s2):
if len(s1) > len(s2):
s1, s2 = s2, s1
distances = range(len(s1) + 1)
for i2, c2 in enumerate(s2):
distances_ = [i2+1]
for i1, c1 in enumerate(s1):
if c1 == c2:
distances_.append(distances[i1])
else:
distances_.append(1 + min((distances[i1], distances[i1 + 1], distances_[-1])))
distances = distances_
return distances[-1]
И пара больше реализаций здесь .
Вы не должны вывести и восстановить. Необходимо смочь просто отбросить ограничение, восстановить его с каскадом, сделать Ваш, удаляет, отбросьте его снова, и восстанавливание его с ограничивает.
CREATE TABLE "header"
(
header_id serial NOT NULL,
CONSTRAINT header_pkey PRIMARY KEY (header_id)
);
CREATE TABLE detail
(
header_id integer,
stuff text,
CONSTRAINT detail_header_id_fkey FOREIGN KEY (header_id)
REFERENCES "header" (header_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
insert into header values(1);
insert into detail values(1,'stuff');
delete from header where header_id=1;
alter table detail drop constraint detail_header_id_fkey;
alter table detail add constraint detail_header_id_fkey FOREIGN KEY (header_id)
REFERENCES "header" (header_id) on delete cascade;
delete from header where header_id=1;
alter table detail add constraint detail_header_id_fkey FOREIGN KEY (header_id)
REFERENCES "header" (header_id) on delete restrict;
Можно хотеть изучить использование схем с PostgreSQL. Я сделал это в прошлых проектах позволить различным группам людей или разработчиков иметь свои собственные данные. Затем можно использовать сценарии для создания нескольких копий базы данных для просто таких ситуаций.
Вы могли создать ограничения внешнего ключа как ДОПУСКАЮЩИЕ ЗАДЕРЖКУ. Затем Вы смогли бы временно отключить их, в то время как Вы вычищаете данные и повторно включаете им, когда Вы сделаны. Взгляните на этот вопрос.
@Tony: Нет, схемы могут быть полезными, и действительно, мы используем их для данных раздела в нашей базе данных. Но я говорю о попытке вычистить уязвимые данные прежде, чем позволить консультанту иметь копию дб. Я хочу те данные, которые уводят.
Я не думаю, что необходимо было бы обработать файл дампа как этот. Сделайте дамп/восстановление потоковой передачи и процесс это. Что-то как:
createdb -h scratchserver scratchdb
createdb -h scratchserver sanitizeddb
pg_dump -h liveserver livedb --schema-only | psql -h scratchserver sanitizeddb
pg_dump -h scratchserver sanitizeddb | sed -e "s/RESTRICT/CASCADE/" | psql -h scratchserver scratchdb
pg_dump -h liveserver livedb --data-only | psql -h scratchserver scratchdb
psql -h scrachserver scratchdb -f delete-sensitive.sql
pg_dump -h scratchserver scratchdb --data-only | psql -h scratchserver sanitizeddb
pg_dump -Fc -Z9 -h scratchserver sanitizedb > sanitizeddb.pgdump
где Вы храните, все Ваш УДАЛЯТЬ sqls в удаляют-sensitive.sql. sanitizeddb база данных/шаги может быть удалена, если Вы не возражаете, консультант, получающий дб с КАСКАДНЫМИ внешними ключами вместо, ОГРАНИЧИВАЮТ внешние ключи.
Могли бы также быть лучшие пути в зависимости от того, как часто необходимо сделать это, насколько большой база данных, и какой процент данных чувствителен, но я не могу думать о более простом способе сделать это несколько раз для довольно размерной базы данных. Вам была бы нужна другая база данных, в конце концов, поэтому если у Вас уже нет slony кластера, не может избежать цикла дампа/восстановления, который мог бы быть трудоемким.
TRUNCATE table CASCADE;
Я новичок в Postgres, поэтому я не уверен в компромиссе между TRUNCATE и DROP.