Это своего рода общий вопрос, который возник в нескольких контекстах, пример ниже является представительным, но не исчерпывающим. Меня интересуют любые способы обучения работе с Postgres на несовершенных (но достаточно близких) источниках данных.
Особый случай - я использую Postgres с PostGIS для работы с правительственными данными, опубликованными в шейп-файлах и XML. Используя модуль shp2pgsql, распространяемый вместе с PostGIS (например, на этом наборе данных), я часто получаю следующую схему:
Column | Type |
------------+-----------------------+-
gid | integer |
st_fips | character varying(7) |
sfips | character varying(5) |
county_fip | character varying(12) |
cfips | character varying(6) |
pl_fips | character varying(7) |
id | character varying(7) |
elevation | character varying(11) |
pop_1990 | integer |
population | character varying(12) |
name | character varying(32) |
st | character varying(12) |
state | character varying(16) |
warngenlev | character varying(13) |
warngentyp | character varying(13) |
watch_warn | character varying(14) |
zwatch_war | bigint |
prog_disc | bigint |
zprog_disc | bigint |
comboflag | bigint |
land_water | character varying(13) |
recnum | integer |
lon | numeric |
lat | numeric |
the_geom | geometry |
Я знаю, что по крайней мере 10 из этих varchars - фипы, высота, население и т. Д. Должны быть целыми; но при попытке привести их к ошибке я получаю ошибки. В общем, я думаю, что мог бы решить большинство моих проблем, позволив Postgres принять пустую строку в качестве значения по умолчанию для столбца - скажем, 0 или -1 для типа int - при изменении столбца и изменении типа. Возможно ли это?
Если я создаю таблицу перед импортом с объявлениями типов, сгенерированными из исходного источника данных, я получаю лучшие типы, чем с shp2pgsql, и могу перебирать записи источника, подавая их в базу данных, отбрасывая любые неудачные вставки. Основная проблема заключается в том, что если у меня 1% плохих полей, равномерно распределенных по 25 столбцам, я потеряю 25% моих данных, так как данная вставка потерпит неудачу, если какое-либо поле будет неправильным. Мне бы хотелось иметь возможность вставлять все возможное и исправлять любые проблемы позже, а не терять столько строк.
Приветствуются любые отзывы людей, которые сталкивались с подобными проблемами - я не парень из MySQL, пытающийся заставить PostgreSQL совершать те же ошибки, к которым я привык, - просто иметь дело с данными, над которыми у меня нет полного контроля .