kandata 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -0
- data/README.md +28 -19
- data/circle.yml +4 -0
- data/exe/kandata +1 -1
- data/kandata.gemspec +1 -0
- data/lib/kandata.rb +5 -2
- data/lib/kandata/active_record.rb +21 -0
- data/lib/kandata/database.rb +23 -23
- data/lib/kandata/database/connection_info.rb +19 -0
- data/lib/kandata/tsv_file.rb +8 -1
- data/lib/kandata/version.rb +1 -1
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 81234a446c42f891691c7c5d8130512c0a7eaa2b
|
4
|
+
data.tar.gz: 03e57575d6a39b3f056f433fad9cb791ab21dafa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87912e4ff0f911b3da0e8292877615cf5f8e1ad179d02f22f49ceb3e1eddde9b90965b37440a991aefa6131e94996888c6a6f278a918c79b88043537c82bb3ad
|
7
|
+
data.tar.gz: 776f38b3353eab850e80c3af4d887d51947ad69f3329f72f8f8dfb9d225d47534c49229c73d48251e68b4169fb4f608850b571da60f6f129cbb5cf7f8d79ed07
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -1,37 +1,46 @@
|
|
1
1
|
# Kandata
|
2
2
|
|
3
3
|
[](https://circleci.com/gh/tamano/kandata)
|
4
|
+
[](https://badge.fury.io/rb/kandata)
|
4
5
|
|
5
|
-
|
6
|
+
Kandataは、TSVファイルを自分のローカルのMySQLデータベース内に簡単にロードするためのツールです。
|
7
|
+
現在はコマンドラインツールとしてのみ動作します。
|
6
8
|
|
7
|
-
|
9
|
+
## インストール方法
|
8
10
|
|
9
|
-
|
11
|
+
以下のコマンドでインストールしてください。
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
```ruby
|
14
|
-
gem 'kandata'
|
15
|
-
```
|
16
|
-
|
17
|
-
And then execute:
|
13
|
+
$ gem install kandata
|
18
14
|
|
19
|
-
|
15
|
+
MySQLサーバーがローカルで動作している必要があります。
|
20
16
|
|
21
|
-
|
17
|
+
## 利用方法
|
22
18
|
|
23
|
-
|
19
|
+
以下のように実行します。
|
24
20
|
|
25
|
-
|
21
|
+
$ kandata load_tsv TSVファイル名 [--force]
|
22
|
+
|
23
|
+
実行すると、ローカルのMySQLの中に`kandata.TSVファイル名`というテーブルが作成され、TSVの内容がロードされます。
|
24
|
+
後は煮るなり焼くなり、自由に使ってください。
|
26
25
|
|
27
|
-
|
26
|
+
なお、TSVファイル内で最初のカラムが`id`という名前だった場合、そのカラムがPKとして扱われます。
|
27
|
+
最初のカラムが`id`ではなかった場合、テーブルには自動的に`id`というAUTO_INCREMENTなカラムが追加されます。
|
28
|
+
先頭以外に`id`という名前のカラムがあった場合はエラーとなります。
|
28
29
|
|
29
|
-
|
30
|
+
`--force`オプションを指定すると、実行時に同名のテーブルがあった場合は一度削除して作り直します。
|
31
|
+
指定していない場合は、エラーとなります。
|
30
32
|
|
31
|
-
|
33
|
+
## 制限事項
|
34
|
+
- ローカルでMySQLサーバーが動いていて`root`ユーザーがパスワードなしでログイン可能な前提となっています。
|
35
|
+
- MySQL以外のRDBMSには現時点では対応していません。
|
36
|
+
- `id`を除く各カラムは`VARCHAR(128)`として作られます。他の型を選ぶことは出来ません。
|
37
|
+
- 各カラムへのINDEXの追加には対応していません。必要な場合は自分でSQLで`CREATE INDEX`してください。
|
32
38
|
|
33
|
-
|
39
|
+
## 今後の予定
|
40
|
+
- 作成したテーブルに応じたActiveRecordモデルを自動生成できるようにする。
|
41
|
+
- `require`で非RailsなRubyスクリプトで読み込んで使えるように。
|
42
|
+
- 作成したテーブルのバックアップなどの機能を追加する。
|
34
43
|
|
35
44
|
## Contributing
|
36
45
|
|
37
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
46
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/tamano/kandata.
|
data/circle.yml
CHANGED
data/exe/kandata
CHANGED
data/kandata.gemspec
CHANGED
data/lib/kandata.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
require 'kandata/active_record'
|
2
3
|
require 'kandata/database'
|
4
|
+
require 'kandata/database/connection_info'
|
3
5
|
require 'kandata/tsv_file'
|
4
6
|
require 'kandata/version'
|
5
7
|
require 'kandata/cli'
|
@@ -7,9 +9,10 @@ require 'kandata/cli'
|
|
7
9
|
class Kandata
|
8
10
|
# load_tsvの後に、ActiveRecordのインスタンスを返す
|
9
11
|
def self.build_from_tsv(filename, force_load)
|
10
|
-
|
12
|
+
full_table_name = load_tsv(filename, force_load)
|
11
13
|
|
12
|
-
|
14
|
+
Kandata::ActiveRecord.connect
|
15
|
+
Kandata::ActiveRecord.create_model(full_table_name.split('.').last)
|
13
16
|
end
|
14
17
|
|
15
18
|
# テーブルを作成し、テーブルにデータを読み込み、テーブル名を戻す
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'active_record'
|
3
|
+
|
4
|
+
class Kandata
|
5
|
+
class ActiveRecord < ActiveRecord::Base
|
6
|
+
def self.connect
|
7
|
+
establish_connection(
|
8
|
+
adapter: 'mysql2',
|
9
|
+
host: Kandata::Database::ConnectionInfo.host,
|
10
|
+
username: Kandata::Database::ConnectionInfo.user_name,
|
11
|
+
database: Kandata::Database::ConnectionInfo.database_name
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.create_model(table_name)
|
16
|
+
Class.new(Kandata::ActiveRecord) do
|
17
|
+
self.table_name = table_name
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/kandata/database.rb
CHANGED
@@ -6,24 +6,31 @@ class Kandata
|
|
6
6
|
class Database < Mysql2::Client
|
7
7
|
def initialize
|
8
8
|
create_database_if_not_exists
|
9
|
-
super(
|
9
|
+
super(
|
10
|
+
Kandata::Database::ConnectionInfo.host_and_user.merge(
|
11
|
+
database: Kandata::Database::ConnectionInfo.database_name,
|
12
|
+
local_infile: true
|
13
|
+
)
|
14
|
+
)
|
10
15
|
end
|
11
16
|
|
12
17
|
# ignore :reek:ControlParameter:
|
13
18
|
def load_tsv(filename, force_update)
|
14
|
-
tsv = Kandata::TsvFile.new(filename)
|
19
|
+
@tsv = Kandata::TsvFile.new(filename)
|
15
20
|
|
16
|
-
drop_table
|
17
|
-
create_table
|
21
|
+
drop_table if force_update
|
22
|
+
create_table
|
23
|
+
load_data
|
18
24
|
|
19
|
-
|
25
|
+
full_table_name
|
20
26
|
end
|
21
27
|
|
22
28
|
private
|
23
29
|
|
24
30
|
# ignore :reek:FeatureEnvy:
|
25
31
|
def create_database_if_not_exists
|
26
|
-
client = Mysql2::Client.new(
|
32
|
+
client = Mysql2::Client.new(Kandata::Database::ConnectionInfo.host_and_user)
|
33
|
+
database_name = Kandata::Database::ConnectionInfo.database_name
|
27
34
|
|
28
35
|
begin
|
29
36
|
client.query("SHOW CREATE DATABASE #{database_name}")
|
@@ -33,13 +40,12 @@ class Kandata
|
|
33
40
|
end
|
34
41
|
end
|
35
42
|
|
36
|
-
def drop_table
|
37
|
-
query("DROP TABLE IF EXISTS #{full_table_name
|
43
|
+
def drop_table
|
44
|
+
query("DROP TABLE IF EXISTS #{full_table_name}")
|
38
45
|
end
|
39
46
|
|
40
|
-
|
41
|
-
|
42
|
-
columns = tsv.headers
|
47
|
+
def create_table
|
48
|
+
columns = @tsv.headers
|
43
49
|
|
44
50
|
# 後で追加するため一旦削除
|
45
51
|
columns.delete('id')
|
@@ -47,24 +53,18 @@ class Kandata
|
|
47
53
|
columns_text = columns.map { |column| "#{column} VARCHAR(128)" }.join(',')
|
48
54
|
columns_text = 'id INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,' + columns_text
|
49
55
|
|
50
|
-
query("CREATE TABLE #{full_table_name
|
56
|
+
query("CREATE TABLE #{full_table_name} (#{columns_text})")
|
51
57
|
end
|
52
58
|
|
53
|
-
|
54
|
-
|
55
|
-
sql
|
56
|
-
sql += "(#{tsv.headers.join(',')})"
|
59
|
+
def load_data
|
60
|
+
sql = "LOAD DATA LOCAL INFILE '#{@tsv.filename}' INTO TABLE #{full_table_name} IGNORE 1 LINES "
|
61
|
+
sql += "(#{@tsv.headers.join(',')})"
|
57
62
|
|
58
63
|
query(sql)
|
59
|
-
full_table_name(tsv)
|
60
|
-
end
|
61
|
-
|
62
|
-
def database_name
|
63
|
-
'kandata'
|
64
64
|
end
|
65
65
|
|
66
|
-
def full_table_name
|
67
|
-
"#{database_name}.#{tsv.table_name}"
|
66
|
+
def full_table_name
|
67
|
+
"#{Kandata::Database::ConnectionInfo.database_name}.#{@tsv.table_name}"
|
68
68
|
end
|
69
69
|
end
|
70
70
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Kandata
|
4
|
+
class Database
|
5
|
+
class ConnectionInfo
|
6
|
+
class << self
|
7
|
+
attr_reader :host, :user_name, :database_name
|
8
|
+
end
|
9
|
+
|
10
|
+
@host = 'localhost'
|
11
|
+
@user_name = 'root'
|
12
|
+
@database_name = 'kandata'
|
13
|
+
|
14
|
+
def self.host_and_user
|
15
|
+
{ host: @host, username: @user_name }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/kandata/tsv_file.rb
CHANGED
@@ -6,12 +6,17 @@ class Kandata
|
|
6
6
|
|
7
7
|
def initialize(filename)
|
8
8
|
@filename = filename
|
9
|
-
|
9
|
+
validate_filename
|
10
10
|
|
11
11
|
@headers = File.open(@filename, 'r').first(&:readline).chomp.split("\t")
|
12
12
|
validate_headers
|
13
13
|
end
|
14
14
|
|
15
|
+
def validate_filename
|
16
|
+
raise 'テーブル名に使用できないファイル名です' unless table_name.match?(/^[0-9a-zA-Z$_]+$/)
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
15
20
|
def validate_headers
|
16
21
|
duplicated_columns = @headers.group_by { |value| value }.reject { |_key, value| value.one? }.keys
|
17
22
|
raise "以下のカラムが複数存在しています #{duplicated_columns}" unless duplicated_columns.empty?
|
@@ -21,6 +26,8 @@ class Kandata
|
|
21
26
|
|
22
27
|
# 現時点では、ミス防止のため、先頭以外にidカラムがあるとエラーとして処理する
|
23
28
|
raise '先頭以外にidカラムがあります' if include_id_column? && @headers[0] != 'id'
|
29
|
+
|
30
|
+
true
|
24
31
|
end
|
25
32
|
|
26
33
|
def table_name
|
data/lib/kandata/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kandata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuya TAMANO
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: activerecord
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: mysql2
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -145,8 +159,10 @@ files:
|
|
145
159
|
- exe/kandata
|
146
160
|
- kandata.gemspec
|
147
161
|
- lib/kandata.rb
|
162
|
+
- lib/kandata/active_record.rb
|
148
163
|
- lib/kandata/cli.rb
|
149
164
|
- lib/kandata/database.rb
|
165
|
+
- lib/kandata/database/connection_info.rb
|
150
166
|
- lib/kandata/tsv_file.rb
|
151
167
|
- lib/kandata/version.rb
|
152
168
|
homepage: https://github.com/tamano/kandata
|