Как вставить .sql с данными таблицы в postgres [duplicate]

Попробуйте использовать .live() вместо .bind(); .live() свяжет .hover с вашим флажком после выполнения запроса Ajax.

477
задан Erwin Brandstetter 9 April 2017 в 18:59
поделиться

13 ответов

Используйте этот код SQL

    copy table_name(atribute1,attribute2,attribute3...)
    from 'E:\test.csv' delimiter ',' csv header

ключевое слово заголовка позволяет СУБД знать, что файл csv имеет заголовок с атрибутами

для более посещаемости http: // www.postgresqltutorial.com/import-csv-file-into-posgresql-table/

4
ответ дан alfonx 18 August 2018 в 11:34
поделиться

Как сказал Павел, импорт работает в pgAdmin:

щелкните правой кнопкой мыши по таблице -> import

выберите локальный файл, формат и кодирование

здесь german pgAdmin GUI screenshot:

аналогичная вещь, которую вы можете сделать с DbVisualizer (у меня есть лицензия, не уверенная о бесплатной версии)

щелкните правой кнопкой мыши по таблице -> Импортировать данные таблицы ...

18
ответ дан Andreas L. 18 August 2018 в 11:34
поделиться
  • 1
    DBVisualizer занял 50 секунд, чтобы импортировать 1400 строк с тремя полями - и мне пришлось отбросить все из String до того, что это было. – Noumenon 29 September 2016 в 10:46

Если у вас нет разрешения использовать COPY (которые работают на сервере db), вы можете вместо этого использовать \copy (что работает в db-клиенте). Используя тот же пример, что и Божидар Бацов:

Создайте свою таблицу:

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
146
ответ дан bjelli 18 August 2018 в 11:34
поделиться
  • 1
    \ копировать избирателей (ZIP, CITY) FROM '/Users/files/Downloads/WOOD.TXT' DELIMITER ',' CSV HEADER; ОШИБКА: дополнительные данные после последнего ожидаемого столбца КОНТЕКСТ: избиратели КОПИИ, строка 2: «OH0012781511,87,26953, ДОМОХОЗЯЙКА, ШЕРРИ, LEIGH», 11/26 / 1965,08 / 19/1988, 211 N GARFIELD ST, BLOOMD ... & Quot; – JZ. 6 September 2015 в 17:29
  • 2
    @JZ. У меня была аналогичная ошибка. Это потому, что у меня были лишние пустые столбцы. Проверьте свой csv, и если у вас есть пустые столбцы, это может быть причиной. – alex bennett 8 July 2016 в 04:32
  • 3
    Это несколько вводит в заблуждение: разница между COPY и \copy намного больше, чем просто разрешения, и вы не можете просто добавить ``, чтобы сделать магическую работу. См. Описание (в контексте экспорта) здесь: stackoverflow.com/a/1517692/157957 – IMSoP 26 January 2017 в 17:29
  • 4
    @IMSoP: вы правы, я добавил упоминание сервера и клиента, чтобы уточнить – bjelli 27 January 2017 в 10:03
  • 5
    @bjelli \ копирует медленнее, чем копия? У меня есть файл 1.5 Мбайт и экземпляр db.m4.large в RDS, и было время, когда эта команда копирования была запущена (как минимум 3). – Sebastian 28 May 2018 в 22:38

Вы также можете использовать pgAdmin, который предлагает графический интерфейс для импорта. Это показано в этом потоке SO . Преимущество использования pgAdmin в том, что он также работает для удаленных баз данных.

Как и предыдущие решения, вам нужно будет иметь свою таблицу в базе данных уже. У каждого человека есть свое решение, но то, что я обычно делаю, это открыть CSV в Excel, скопировать заголовки, вставить специальные с транспозицией на другой рабочий лист, поместить соответствующий тип данных в следующий столбец, а затем просто скопировать и вставить его в текстовый редактор вместе с соответствующим запросом на создание таблицы SQL следующим образом:

CREATE TABLE my_table (
    /*paste data from Excel here for example ... */
    col_1 bigint,
    col_2 bigint,
    /* ... */
    col_n bigint 
)
27
ответ дан Community 18 August 2018 в 11:34
поделиться
  • 1
    PLS показывает пару строк выборки ваших вставленных данных – dcorking 19 April 2018 в 11:07

Взгляните на эту короткую статью .


Решение перефразировано здесь:

Создайте свою таблицу:

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);
670
ответ дан dylanfprice 18 August 2018 в 11:34
поделиться
  • 1
    на самом деле использование \ copy будет делать тот же трюк, если у вас нет доступа суперпользователя; он жалуется на мою Fedora 16 при использовании COPY с учетной записью без полномочий. – asksw0rder 15 October 2012 в 18:07
  • 2
    СОВЕТ: вы можете указать, какие столбцы у вас есть в CSV, используя zip_codes (col1, col2, col3). Столбцы должны быть перечислены в том же порядке, что и в файле. – David Pelaez 2 January 2013 в 07:16
  • 3
    @ asksw0rder делает \ copy, имеет тот же синтаксис? bcoz Я получаю синтаксическую ошибку с \ copy – JhovaniC 29 May 2013 в 20:59
  • 4
    – bernie2436 28 October 2013 в 01:09
  • 5
    Вы можете легко включить строку заголовка - просто добавьте HEADER в параметры: COPY zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV HEADER; postgresql.org/docs/9.1/static/sql-copy.html – Barrett Clark 8 November 2013 в 17:17
  1. сначала создайте таблицу
  2. . Затем используйте команду копирования для копирования данных таблицы:

copy table_name (C1, C2, C3 .... ) from 'path to your csv file' delimiter ',' csv header;

Спасибо

1
ответ дан eyllanesc 18 August 2018 в 11:34
поделиться

Личный опыт работы с 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/

6
ответ дан flowera 18 August 2018 в 11:34
поделиться

Если вам нужен простой механизм для импорта из текстового / разборного многострочного 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;

DBFiddle Demo

0
ответ дан Lukasz Szozda 18 August 2018 в 11:34
поделиться

Большинство других решений здесь требуют, чтобы вы создали таблицу заранее / вручную. В некоторых случаях это может оказаться неприемлемым (например, если в таблице назначения много столбцов). Таким образом, подход ниже может пригодиться.

Предоставляя количество путей и столбцов вашего файла csv, вы можете использовать следующую функцию для загрузки таблицы в таблицу temp, которая будет называться как 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
    set schema 'your-schema';

    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;
16
ответ дан mehmet 18 August 2018 в 11:34
поделиться
  • 1
    Привет, Мехмет, спасибо за ответ, который вы опубликовали, но когда я запускаю свой код, я получаю следующее сообщение об ошибке: ERROR: schema & quot; data & quot; не существует – user2867432 8 November 2016 в 06:34
  • 2
    user2867432 вам нужно изменить имя схемы, которое вы используете соответствующим образом (например, public) – mehmet 8 November 2016 в 14:05
  • 3
    Привет, Мехмет, спасибо за решение, это прекрасно, но это работает только в том случае, если пользователь Postgres DB является суперпользователем, так или иначе, чтобы заставить его работать без суперпользователя? – Geeme 23 June 2017 в 09:05
  • 4
    Geeme: читать "определитель безопасности" здесь , но я не использовал его сам. – mehmet 23 June 2017 в 16:55

Создать таблицу и иметь необходимые столбцы, которые используются для создания таблицы в файле csv.

  1. Откройте postgres и щелкните правой кнопкой мыши на целевой таблице, которую вы хотите загрузить & amp; выберите импорт и обновите следующие шаги в разделе параметров файла
  2. Теперь просмотрите файл в имени файла
  3. Выберите csv в формате
  4. Кодирование как ISO_8859_5

Now goto Misc. опции и проверить заголовок и нажать на импорт.

0
ответ дан Pang 18 August 2018 в 11:34
поделиться

Один быстрый способ сделать это с помощью библиотеки pandas 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 is 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]
58
ответ дан RobinL 18 August 2018 в 11:34
поделиться
  • 1
    Кроме того, параметр if_exists может быть установлен для замены или добавления в существующую таблицу, например. df.to_sql("fhrs", engine, if_exists='replace') – Joel Ostblom 30 April 2015 в 00:47
  • 2
    имя пользователя и пароль: необходимо создать Login и назначить БД пользователю. Если используется pgAdmin, затем создайте & quot; Роль Login / Group & quot; использование графического интерфейса пользователя – Somnath Kadam 24 March 2017 в 13:52
  • 3
    Pandas - очень медленный способ загрузки в sql (vs csv-файлы). Может быть на несколько порядков медленнее. – user48956 4 May 2017 в 18:46
  • 4
    Это может быть способ записи данных, но он очень медленный, даже с пакетной и хорошей вычислительной мощностью. Использование CSV - хороший способ добиться этого. – Ankit Singh 13 July 2018 в 14:09

IMHO, наиболее удобным способом является « импортировать CSV-данные в postgresql, удобный способ; -) », используя csvsql из csvkit , который представляет собой пакет python, устанавливаемый через pip.

4
ответ дан ruvim 18 August 2018 в 11:34
поделиться
  • 1
    Ссылка гниль прожорлива! Статья, с которой вы связались, больше не работает, что делает меня неудобным :( – chbrown 27 July 2016 в 20:18
  • 2
    вы можете упомянуть, что это его. – mountainclimber 9 August 2016 в 14:46
  • 3
    Для меня я получаю MemoryError, если пытаюсь импортировать большой CSV, поэтому похоже, что он не поток. – DavidC 20 October 2016 в 12:32
  • 4
    @DavidC Интересно. Насколько велик ваш файл? Сколько у вас памяти? Если он не работает по мере его появления, я предлагаю разбивать данные перед вставкой – sal 31 October 2016 в 13:13
  • 5
    @DavidC Или вы используете команду csvql без опции --insert и вставляете данные позже через COPY, или вы отвечаете на ответ RobinL stackoverflow.com/a/29722393/2772305 – sal 31 October 2016 в 13:20
COPY table_name FROM 'path/to/data.csv' DELIMITER ',' CSV HEADER;
13
ответ дан Tunaki 18 August 2018 в 11:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: