Как я могу написать хранимую процедуру, которая импортирует данные из файла CSV и заполняет таблицу?
Как я могу написать хранимую процедуру, которая импортирует данные из файла CSV и заполняет таблицу?
Ответы:
Посмотрите на эту короткую статью .
Решение перефразировано здесь:
Создайте свою таблицу:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
Скопируйте данные из вашего CSV-файла в таблицу:
COPY zip_codes FROM '/path/to/csv/ZIP_CODES.txt' WITH (FORMAT csv);
COPY zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV HEADER;
postgresql.org/docs/9.1/static/sql-copy.html
Если у вас нет разрешения на использование COPY
(которое работает на сервере БД), вы можете использовать \copy
вместо этого (которое работает в клиенте БД). Используя тот же пример, что и Божидар Бацов:
Создайте свою таблицу:
CREATE TABLE zip_codes
(ZIP char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, ZIP_CLASS varchar);
Скопируйте данные из вашего CSV-файла в таблицу:
\copy zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
Вы также можете указать столбцы для чтения:
\copy zip_codes(ZIP,CITY,STATE) FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV
Смотрите документацию для COPY :
Не путайте COPY с инструкцией psql \ copy. \ copy вызывает COPY FROM STDIN или COPY TO STDOUT, а затем извлекает / сохраняет данные в файле, доступном для клиента psql. Таким образом, доступность файла и права доступа зависят от клиента, а не от сервера при использовании \ copy.
и обратите внимание:
Для столбцов идентификаторов команда COPY FROM всегда записывает значения столбцов, указанные во входных данных, например параметр INSERT OVERRIDING SYSTEM VALUE.
COPY
и \copy
намного больше, чем просто разрешения, и вы не можете просто добавить ``, чтобы он волшебным образом работал. См. Описание (в контексте экспорта) здесь: stackoverflow.com/a/1517692/157957
Одним из быстрых способов сделать это является использование библиотеки панд Python (лучше всего работает версия 0.15 или выше). Это будет обрабатывать создание столбцов для вас - хотя, очевидно, выбор, который он делает для типов данных, может оказаться не тем, что вам нужно. Если это не совсем то, что вам нужно, вы всегда можете использовать код 'create table', сгенерированный как шаблон.
Вот простой пример:
import pandas as pd
df = pd.read_csv('mypath.csv')
df.columns = [c.lower() for c in df.columns] #postgres doesn't like capitals or spaces
from sqlalchemy import create_engine
engine = create_engine('postgresql://username:password@localhost:5432/dbname')
df.to_sql("my_table_name", engine)
А вот код, который показывает вам, как установить различные параметры:
# Set it so the raw sql output is logged
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
df.to_sql("my_table_name2",
engine,
if_exists="append", #options are ‘fail’, ‘replace’, ‘append’, default ‘fail’
index=False, #Do not output the index of the dataframe
dtype={'col1': sqlalchemy.types.NUMERIC,
'col2': sqlalchemy.types.String}) #Datatypes should be [sqlalchemy types][1]
if_exists
параметр может быть установлен для замены или добавления к существующей таблице, напримерdf.to_sql("fhrs", engine, if_exists='replace')
df.to_sql()
очень медленно, вы можете использовать d6tstack.utils.pd_to_psql()
из d6tstack посмотреть сравнение производительности
Вы также можете использовать pgAdmin, который предлагает графический интерфейс для импорта. Это показано в этой теме . Преимущество использования pgAdmin заключается в том, что он также работает для удаленных баз данных.
Как и в предыдущих решениях, ваша таблица должна быть уже в базе данных. У каждого человека есть свое решение, но я обычно открываю CSV в Excel, копирую заголовки, вставляю специальные с транспозицией в другой лист, помещаю соответствующий тип данных в следующий столбец, затем просто копирую и вставляю его в текстовый редактор. вместе с соответствующим запросом на создание таблицы SQL следующим образом:
CREATE TABLE my_table (
/*paste data from Excel here for example ... */
col_1 bigint,
col_2 bigint,
/* ... */
col_n bigint
)
Большинство других решений здесь требуют, чтобы вы создали таблицу заранее / вручную. В некоторых случаях это может быть непрактично (например, если в таблице назначения много столбцов). Таким образом, подход ниже может пригодиться.
Предоставляя путь и количество столбцов вашего CSV-файла, вы можете использовать следующую функцию для загрузки вашей таблицы во временную таблицу, которая будет называться как target_table
:
Предполагается, что в верхней строке есть имена столбцов.
create or replace function data.load_csv_file
(
target_table text,
csv_path text,
col_count integer
)
returns void as $$
declare
iter integer; -- dummy integer to iterate columns with
col text; -- variable to keep the column name at each iteration
col_first text; -- first column name, e.g., top left corner on a csv file or spreadsheet
begin
create table temp_table ();
-- add just enough number of columns
for iter in 1..col_count
loop
execute format('alter table temp_table add column col_%s text;', iter);
end loop;
-- copy the data from csv file
execute format('copy temp_table from %L with delimiter '','' quote ''"'' csv ', csv_path);
iter := 1;
col_first := (select col_1 from temp_table limit 1);
-- update the column names based on the first row which has the column names
for col in execute format('select unnest(string_to_array(trim(temp_table::text, ''()''), '','')) from temp_table where col_1 = %L', col_first)
loop
execute format('alter table temp_table rename column col_%s to %s', iter, col);
iter := iter + 1;
end loop;
-- delete the columns row
execute format('delete from temp_table where %s = %L', col_first, col_first);
-- change the temp table name to the name given as parameter, if not blank
if length(target_table) > 0 then
execute format('alter table temp_table rename to %I', target_table);
end if;
end;
$$ language plpgsql;
public
)
Как упоминал Пол, импорт работает в pgAdmin:
щелкните правой кнопкой мыши по таблице -> импорт
выберите локальный файл, формат и кодировку
вот немецкий скриншот pgAdmin GUI:
То же самое вы можете сделать с DbVisualizer (у меня есть лицензия, но я не уверен насчет бесплатной версии)
щелкните правой кнопкой мыши таблицу -> Импортировать данные таблицы ...
сначала создайте таблицу
Затем используйте команду copy, чтобы скопировать данные таблицы:
скопировать имя_таблицы (C1, C2, C3 ....)
из 'path to your csv file' delimiter ',' csv header;
Спасибо
Используйте этот код SQL
copy table_name(atribute1,attribute2,attribute3...)
from 'E:\test.csv' delimiter ',' csv header
ключевое слово header позволяет СУБД знать, что файл csv имеет заголовок с атрибутами
для получения дополнительной информации посетите http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
Личный опыт работы с PostgreSQL все еще ждет более быстрого пути.
1. Сначала создайте скелет таблицы, если файл хранится локально:
drop table if exists ur_table;
CREATE TABLE ur_table
(
id serial NOT NULL,
log_id numeric,
proc_code numeric,
date timestamp,
qty int,
name varchar,
price money
);
COPY
ur_table(id, log_id, proc_code, date, qty, name, price)
FROM '\path\xxx.csv' DELIMITER ',' CSV HEADER;
2. Когда файл \ path \ xxx.csv находится на сервере, postgreSQL не имеет разрешения на доступ к серверу, вам придется импортировать файл .csv через встроенную функциональность pgAdmin.
Щелкните правой кнопкой мыши имя таблицы и выберите импорт.
Если проблема не устранена, обратитесь к этому руководству. http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
Как импортировать данные файла CSV в таблицу PostgreSQL?
шаги:
Необходимо подключить базу данных postgresql в терминале
psql -U postgres -h localhost
Нужно создать базу данных
create database mydb;
Необходимо создать пользователя
create user siva with password 'mypass';
Связаться с базой данных
\c mydb;
Нужно создать схему
create schema trip;
Нужно создать таблицу
create table trip.test(VendorID int,passenger_count int,trip_distance decimal,RatecodeID int,store_and_fwd_flag varchar,PULocationID int,DOLocationID int,payment_type decimal,fare_amount decimal,extra decimal,mta_tax decimal,tip_amount decimal,tolls_amount int,improvement_surcharge decimal,total_amount
);
Импорт данных CSV-файла в postgresql
COPY trip.test(VendorID int,passenger_count int,trip_distance decimal,RatecodeID int,store_and_fwd_flag varchar,PULocationID int,DOLocationID int,payment_type decimal,fare_amount decimal,extra decimal,mta_tax decimal,tip_amount decimal,tolls_amount int,improvement_surcharge decimal,total_amount) FROM '/home/Documents/trip.csv' DELIMITER ',' CSV HEADER;
Найти данные данной таблицы
select * from trip.test;
ИМХО, наиболее удобный способ - следовать « Импортировать данные CSV в postgresql, удобный способ ;-) », используя csvsql из csvkit , который представляет собой пакет python, устанавливаемый через pip.
В Python вы можете использовать этот код для автоматического создания таблицы PostgreSQL с именами столбцов:
import pandas, csv
from io import StringIO
from sqlalchemy import create_engine
def psql_insert_copy(table, conn, keys, data_iter):
dbapi_conn = conn.connection
with dbapi_conn.cursor() as cur:
s_buf = StringIO()
writer = csv.writer(s_buf)
writer.writerows(data_iter)
s_buf.seek(0)
columns = ', '.join('"{}"'.format(k) for k in keys)
if table.schema:
table_name = '{}.{}'.format(table.schema, table.name)
else:
table_name = table.name
sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format(table_name, columns)
cur.copy_expert(sql=sql, file=s_buf)
engine = create_engine('postgresql://user:password@localhost:5432/my_db')
df = pandas.read_csv("my.csv")
df.to_sql('my_table', engine, schema='my_schema', method=psql_insert_copy)
Это также относительно быстро, я могу импортировать более 3,3 миллиона строк примерно за 4 минуты.
Если вам нужен простой механизм для импорта из текстового / синтаксического анализа многострочного CSV, вы можете использовать:
CREATE TABLE t -- OR INSERT INTO tab(col_names)
AS
SELECT
t.f[1] AS col1
,t.f[2]::int AS col2
,t.f[3]::date AS col3
,t.f[4] AS col4
FROM (
SELECT regexp_split_to_array(l, ',') AS f
FROM regexp_split_to_table(
$$a,1,2016-01-01,bbb
c,2,2018-01-01,ddd
e,3,2019-01-01,eee$$, '\n') AS l) t;
DBeaver Community Edition (dbeaver.io) упрощает подключение к базе данных, а затем импортирует файл CSV для загрузки в базу данных PostgreSQL. Это также упрощает выдачу запросов, получение данных и загрузку наборов результатов в CSV, JSON, SQL или другие распространенные форматы данных.
Это многоплатформенный инструмент для баз данных FOSS для программистов SQL, администраторов баз данных и аналитиков, который поддерживает все популярные базы данных: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto и т. Д. Это жизнеспособный конкурент FOSS для TOAD для Postgres, TOAD для SQL Server или Toad для Oracle.
Я не имею никакого отношения к DBeaver. Мне нравится цена (БЕСПЛАТНО!) И полная функциональность, но я бы хотел, чтобы они больше открывали это приложение DBeaver / Eclipse и позволяли легко добавлять аналитические виджеты в DBeaver / Eclipse, а не требовать от пользователей платить за годовую подписку всего в 199 долларов. создавать графики и диаграммы непосредственно в приложении. Мои навыки Java-кодирования устарели, и я не хочу потратить недели на то, чтобы заново научиться создавать виджеты Eclipse (только чтобы обнаружить, что DBeaver, вероятно, отключил возможность добавления сторонних виджетов в DBeaver Community Edition.)
Могут ли опытные пользователи DBeaver, которые являются разработчиками Java, дать некоторое представление о шагах по созданию аналитических виджетов для добавления в Community Edition DBeaver?
Создать таблицу и иметь обязательные столбцы, которые используются для создания таблицы в CSV-файле.
Откройте postgres и щелкните правой кнопкой мыши на целевой таблице, которую вы хотите загрузить, и выберите импорт и обновите следующие шаги в разделе параметров файла.
Теперь просмотрите ваш файл в имени файла
Выберите CSV в формате
Кодировка как ISO_8859_5
Теперь перейдите на доп. Параметры и проверьте заголовок и нажмите на импорт.
Я создал небольшой инструмент, который csv
очень легко импортирует файл в PostgreSQL, просто команду, которая будет создавать и заполнять таблицы, к сожалению, в настоящий момент все автоматически созданные поля используют тип TEXT
csv2pg users.csv -d ";" -H 192.168.99.100 -U postgres -B mydatabase
Этот инструмент можно найти на https://github.com/eduardonunesp/csv2pg.
psql -h 192.168.99.100 -U postgres mydatabase -c "COPY users FROM 'users.csv' DELIMITER ';' CSV"
? Я думаю, что часть, где она создает таблицу, хороша, но так как каждое поле - текст, это не супер полезно