データベースにCSV行を挿入する


TLR


つのRubyメソッドを使用すると、CSVファイルの各行を取得し、リレーショナルデータベースにすべての値を挿入できます.
CVSについてもっと知りたい場合は、Rubyを使って解析してください.

前処理


MacOSとZSHを使っています.データベースについては、PostgreSQLを使用して' pg ' gemを通じてアクセスします.これが複雑に聞こえるなら、心配しないでください.この記事は一歩一歩歩いていきます!
これを読んだ後、フレームワークの助けを借りずにRubyオブジェクトをデータベースに永続化するスキルがあります.ここでは柵はない.クール右?始めましょう.

始める


まず、postgresと' pg ' gemがインストールされていることを確認する必要があります.
Postgresは無料のリレーショナルデータベースシステムです.リレーショナルデータベースは基本的に行と列のテーブルです.テーブルは、データベース内の相互に関連付けることができます.
' pg ' gemはRubyがPostgresと通信する方法です.これはRubyコードのモジュールで、データベースとのインタフェースを提供します.Postgresを使用するRailsアプリケーションでは' pg ' gemを使用しますが、プレーンなRubyファイルでもIRBでも使用できます.
まず、' pg '宝石があるかどうかを確認します.
$ gem info pg

*** LOCAL GEMS ***

pg (1.3.4)
    Authors: Michael Granger, Lars Kanis
    Homepage: https://github.com/ged/ruby-pg
    License: BSD-2-Clause
    Installed at: /Users/jvon1904/.rvm/gems/ruby-3.0.3

    Pg is the Ruby interface to the PostgreSQL RDBMS
あなたがその反応を得なかったならばgem i pg , その後、実行gem info pg それを持っていることを確認します.あなたがバージョンが私のものと異なるならば、心配しないでください.次にpostgresをチェックします.
$ psql --version
psql (PostgreSQL) 14.2
あなたがその応答を得なければ、Postgresをインストールする必要があります.あなたはそうすることができますwebsite , または、あなたは走ることができるbrew install postgres . これで、端末からPostgresを完全に制御できます.ジャストランpsql いつでも、任意のデータベースクエリとメンテナンスを実行するには、完全なCLIを持っている.また、デスクトップアプリケーションを受信する必要がありますあなたのデータベースを表示します.あなたが1つをダブルクリックすると、それはpsql .

psqlを使用したデータベースの作成


少しのSQLを知ることはここで役に立つでしょう、しかし、それは必要でありません.端末セッションを開き、実行するpsql .
$ psql
psql (14.2)
Type "help" for help.

jvon1904=#

# most commands start with backslash, \h, \q, \d
まず、「csv」というデータベースを作成しましょう.
jvon1904=# CREATE DATABASE csv;
CREATE DATABASE
# don't forget the semicolon!
あなたが混乱するならば、あなたは常にそうすることができますDROP DATABASE <name>; . しかし、これは元に戻すことはできません注意してください.
次にテーブルを作成できるようにデータベースに接続する必要があります.
# the '\c' command means 'connect'

jvon1904=# \c csv;
You are now connected to database "csv" as user "jvon1904".
csv=#

# notice the prompt changed to your database name.
接続しているので、テーブルを作りましょう.
# I like to name my tables in the plural
# Creating a table requires us to specify each column name and type, there are lot's of additional options as well.

csv=# CREATE TABLE contacts(
id INT PRIMARY KEY NOT NULL,
first_name TEXT,
last_name TEXT,
age INT,
gender CHAR(1)
);
CREATE TABLE
今、あなたは\d テーブルを'記述'するコマンド.これにより、テーブルからテーブルスキーマを見ることができます.
csv=# \d contacts
                  Table "public.contacts"
   Column   |     Type     | Collation | Nullable | Default
------------+--------------+-----------+----------+---------
 id         | integer      |           | not null |
 first_name | text         |           |          |
 last_name  | text         |           |          |
 age        | integer      |           |          |
 gender     | character(1) |           |          |
Indexes:
    "contacts_pkey" PRIMARY KEY, btree (id)
テーブルがセットされたので、データを追加してテストしましょう.SQLを実行するINSERT INTO 文.
csv=# INSERT INTO contacts (id, first_name, last_name, age, gender)
csv-# VALUES (298, 'Rudolph', 'Smith', 50, 'M');
INSERT 0 1
SQLを実行するSELECT あなたのデータを見る声明.
csv=# SELECT * FROM contacts;
 id  | first_name | last_name | age | gender
-----+------------+-----------+-----+--------
 298 | Rudolph    | Smith     |  50 | M
(1 row)
あなたの制約とデータ型が正しく動作していることを確認するには、悪いデータを挿入しようとすることができます.
# char(1) should only accept one character.
# so what happens when I try to insert 'xx'?

csv=# INSERT INTO contacts (id, first_name, last_name, age, gender)
VALUES (298, 'Rudolph', 'Smith', 50, 'XX');
ERROR:  value too long for type character(1)

# or an entry with a duplicate id

csv=# INSERT INTO contacts (id, first_name, last_name, age, gender)
VALUES (298, 'Rudolphina', 'Smith', 50, 'F');
ERROR:  duplicate key value violates unique constraint "contacts_pkey"
DETAIL:  Key (id)=(298) already exists.
すごい!我々の新しいd . bテーブルのようなルックスは、ちょうどうまく働いています!そして、あなたはUIでこれを作りました.大仕事!

RubyのPostgresへの接続


IRBセッションを開き、入力してrequire 'pg' . 新しい宝石を使用している任意の時間、それは素晴らしいアイデアは、ドキュメントをチェックアウトすることです.しばしば、初心者を助けるためにガイドがあります.PG Readme .
RubyのローカルPostgresデータベースへの接続は非常に簡単です.だけを使用する#connect メソッド.
> require 'pg'
 => true
> connection = PG.connect( dbname: 'csv' )
 => #<PG::Connection:0x000000013401bbe0>
ああ!pg ::connectionクラスのインスタンスがあります.これでRubyを使用するすべてのSQLを行うことができます.だけを使用する#exec メソッド.実際、ルドルフスミスがまだそこにいるかどうか見ましょう.
> res = connection.exec("SELECT * FROM contacts")
 => #<PG::Result:0x0000000143b54818 status=PGRES_TUPLES_OK ntuples=1 nfiel...
> res[0]
 =>
{"id"=>"298",
 "first_name"=>"Rudolph",
 "last_name"=>"Smith",
 "age"=>"50",
 "gender"=>"M"}

# yep, he's still there
# notice we can use bracket notation on the PG::Result class
# and this is how we access a specific field

> res[0]['first_name']
 => "Rudolph"
悲しいことに、ルドルフは、私たちのCSVの友人のための部屋を作るために行く必要があります.
> connection.exec("DELETE FROM contacts WHERE first_name = 'Rudolph'"
)
 => #<PG::Result:0x0000000143ad4eb0 status=PGRES_COMMAND_OK ntuples=0 nfields=0 cmd_tuples=1>
クイックチャレンジとして、別のターミナルのタブを開き、任意のデータが現在使用しているかどうかを確認しますpsql . 覚えてる?

CSVファイル→Ruby =>データベース


前の記事はCVSとRubyについて話します.私は詳細を再度通過しないので、このトピックに精通していることを確認します.
私は、私がCSVファイルを保存したディレクトリにいます.あなたは自分自身を作ることができます、ちょうどファイルの列がデータベースフィールドと一致することを確認してください.

# you can type shell command with backticks

> `pwd`
 => "/Users/jvon1904/csv\n"
RubyのCSVモジュールを必要とするでしょう.Ruby標準ライブラリ( std Lib )の一部です.では、#foreach メソッド.これは、行ごとにCSVファイル行を通過し、データベースにそれぞれを挿入します.
> require 'csv'
 => true
> require 'pg'
 => true
> connection = PG.connect( dbname: 'csv')
 => #<PG::Connection:0x000000010d81f840>
> CSV.foreach('ruby_made_csv.csv', headers: true) do |row|
>   connection.exec("INSERT INTO contacts (id, first_name, 
    last_name, age, gender) 
    VALUES (#{row[0]}, '#{row[1]}', '#{row[2]}', #{row[3]}, 
    '#{row[4]}')
")
> end
さあ、psqlに戻りましょう.
 psql
psql (14.2)
Type "help" for help.

jvon1904=# \c csv
You are now connected to database "csv" as user "jvon1904".
csv=# SELECT * FROM contacts;
 id | first_name  | last_name | age | gender
----+-------------+-----------+-----+--------
  1 | Victoria    | Waite     |  38 | F
  2 | Jamar       | Hayes     |  37 | M
  3 | Leonard     | Brendle   |  39 | M
  4 | Abby        | Atchison  |  57 | F
  5 | Marc        | Stockton  |  64 | M
  6 | Geraldine   | Roybal    |  52 | F
  7 | James       | Coles     |  57 | M
  8 | Hiram       | Spellman  |  58 | M
  9 | Bradford    | Vela      |  41 | M
 10 | William     | Haskell   |  74 | M
 11 | Christopher | Mason     |  70 | M
 12 | Thomas      | Atkinson  |  68 | M
 13 | Peggy       | Underwood |  37 | F
 14 | Charles     | Wilson    |  66 | M
 15 | Joanne      | Sanchez   |  42 | F
 16 | Leo         | Sanders   |  58 | M
 17 | Robert      | Castillo  |  39 | M
 18 | Joan        | Traxler   |  82 | F
 19 | Dana        | Pitts     |  78 | F
 20 | Susan       | Dupont    |  34 | F
(20 rows)
私たちはそれをやった!CSVファイルのすべては、ルビーによって解析され、リレーショナルデータベースに保存されています.