mass_insert 0.2.2 → 0.2.3
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/.travis.yml +2 -3
- data/README.md +25 -1
- data/lib/mass_insert/adapters/abstract_adapter.rb +3 -3
- data/lib/mass_insert/adapters/mysql2_adapter.rb +17 -1
- data/lib/mass_insert/version.rb +1 -1
- data/test/adapters/mysql2/example_test.rb +26 -0
- data/test/database.yml.example +9 -7
- data/test/models/kind.rb +2 -0
- data/test/schema.rb +5 -1
- data/test/test_helper.rb +11 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 776d7684b8b9dbc9d4232b18baa16db73c2e30e2
|
4
|
+
data.tar.gz: 5f3abd0e966d88cbf1038a5591ace5fba11170b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8574e134b4e067efba5ab705e88c5ebffa6426dc4148f2849b43aceb1ce48cc154645f19fdb82dcb7c2b9136283a7de425011138edfe1e3e55180a92dcd26b59
|
7
|
+
data.tar.gz: 1ba5fedf3377bb938a872545f9a4c0980ddf4bc88d386e489b3189720ac208b4a1ecab3bdb409dbda3caf7b478d4afeb67c9452e9458df3b9f4c5badd5e532fb
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -44,7 +44,7 @@ User.mass_insert(values)
|
|
44
44
|
```
|
45
45
|
|
46
46
|
|
47
|
-
|
47
|
+
### Insertion per batches
|
48
48
|
Due you can get a database timeout error you can specify that the insertion will be in batches.
|
49
49
|
Just pass the `per_batch` option with the records per batch. Example...
|
50
50
|
```ruby
|
@@ -52,6 +52,30 @@ User.mass_insert(values, per_batch: 1000)
|
|
52
52
|
```
|
53
53
|
|
54
54
|
|
55
|
+
### Handle unique index on MySQL
|
56
|
+
Sometimes we want to ignore errors when adding duplicated records. MySQL has
|
57
|
+
the ability to do that with `ON DUPLICATE KEY UPDATE`. By using the option
|
58
|
+
`handle_duplication` we will ignore the new values by doing:
|
59
|
+
```ruby
|
60
|
+
User.mass_insert(values, handle_duplication: true)
|
61
|
+
```
|
62
|
+
|
63
|
+
```sql
|
64
|
+
INSERT INTO table (a,b,c) VALUES (1,2,3)
|
65
|
+
ON DUPLICATE KEY UPDATE a=a,b=b,c=c;
|
66
|
+
```
|
67
|
+
|
68
|
+
[Read more about MySQL ON DUPLICATE KEY UPDATE...](http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html)
|
69
|
+
|
70
|
+
|
71
|
+
## Running tests
|
72
|
+
First at all copy `test/database.yml.example` to `test/database.yml` and update username and password
|
73
|
+
for every database adapters. Then, run the following to test the gem against all adapters.
|
74
|
+
```
|
75
|
+
bundle exec rake test:all
|
76
|
+
```
|
77
|
+
|
78
|
+
|
55
79
|
## Contributing
|
56
80
|
1. Fork it
|
57
81
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
@@ -10,7 +10,7 @@ module MassInsert
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def to_sql
|
13
|
-
"#{insert_sql} #{values_sql}"
|
13
|
+
"#{insert_sql} #{values_sql};"
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
@@ -38,14 +38,14 @@ module MassInsert
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def values_sql
|
41
|
-
"(#{array_of_attributes_sql.join('),(')})
|
41
|
+
"(#{array_of_attributes_sql.join('),(')})"
|
42
42
|
end
|
43
43
|
|
44
44
|
def array_of_attributes_sql
|
45
45
|
values.map do |attrs|
|
46
46
|
columns.map do |name|
|
47
47
|
value = attrs[name.to_sym] || attrs[name.to_s]
|
48
|
-
connection.quote(value
|
48
|
+
connection.quote(value)
|
49
49
|
end.join(',')
|
50
50
|
end
|
51
51
|
end
|
@@ -1,5 +1,21 @@
|
|
1
1
|
module MassInsert
|
2
2
|
module Adapters
|
3
|
-
class Mysql2Adapter < AbstractAdapter
|
3
|
+
class Mysql2Adapter < AbstractAdapter
|
4
|
+
def to_sql
|
5
|
+
"#{insert_sql} #{values_sql} #{on_duplicate_key_update};"
|
6
|
+
end
|
7
|
+
|
8
|
+
def on_duplicate_key_update
|
9
|
+
if @options[:handle_duplication]
|
10
|
+
"ON DUPLICATE KEY UPDATE #{on_duplicate_key_update_values}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def on_duplicate_key_update_values
|
15
|
+
quoted_columns.map do |quoted_column|
|
16
|
+
"#{quoted_column}=#{quoted_column}"
|
17
|
+
end.join(',')
|
18
|
+
end
|
19
|
+
end
|
4
20
|
end
|
5
21
|
end
|
data/lib/mass_insert/version.rb
CHANGED
@@ -1,3 +1,29 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
shared_examples
|
4
|
+
|
5
|
+
describe 'Database Adapters' do
|
6
|
+
let(:attributes) do
|
7
|
+
{ name: 'Ruby' }
|
8
|
+
end
|
9
|
+
|
10
|
+
after :each do
|
11
|
+
Kind.delete_all
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'with duplicated record' do
|
15
|
+
def setup
|
16
|
+
Kind.mass_insert([attributes])
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'does not raises error if is duplicated and has the duplication handler on' do
|
20
|
+
Kind.mass_insert([attributes], handle_duplication: true)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'raises error if is duplicated and does not have the duplication handler on' do
|
24
|
+
assert_raises ActiveRecord::RecordNotUnique do
|
25
|
+
Kind.mass_insert([attributes])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/test/database.yml.example
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
common: &common
|
2
|
-
username: root
|
3
|
-
password:
|
4
2
|
encoding: utf8
|
5
3
|
database: mass_insert_test
|
6
4
|
|
7
|
-
mysql2:
|
5
|
+
mysql2:
|
8
6
|
<<: *common
|
9
7
|
adapter: mysql2
|
8
|
+
username: #your_mysql_username
|
9
|
+
password: #your_mysql_password
|
10
10
|
|
11
|
-
postgresql:
|
11
|
+
postgresql:
|
12
12
|
<<: *common
|
13
|
-
username: postgres
|
14
13
|
adapter: postgresql
|
14
|
+
username: #your_postgresql_username
|
15
|
+
password: #your_postgresql_password
|
15
16
|
|
16
|
-
sqlite3:
|
17
|
+
sqlite3:
|
18
|
+
<<: *common
|
17
19
|
adapter: sqlite3
|
18
|
-
database: tmp/
|
20
|
+
database: tmp/mass_insert_test.db
|
data/test/models/kind.rb
ADDED
data/test/schema.rb
CHANGED
@@ -5,7 +5,11 @@ ActiveRecord::Schema.define do
|
|
5
5
|
t.integer :age
|
6
6
|
t.decimal :money, precision: 10, scale: 2
|
7
7
|
t.date :birth_date
|
8
|
-
|
9
8
|
t.timestamps null: false
|
10
9
|
end
|
10
|
+
|
11
|
+
create_table :kinds, force: true do |t|
|
12
|
+
t.string :name
|
13
|
+
t.index ['name'], name: 'index_kinds_on_name', unique: true, using: :btree
|
14
|
+
end
|
11
15
|
end
|
data/test/test_helper.rb
CHANGED
@@ -17,9 +17,19 @@ FileUtils.mkdir_p('log')
|
|
17
17
|
|
18
18
|
ActiveRecord::Base.logger = Logger.new('log/test.log')
|
19
19
|
ActiveRecord::Base.logger.level = Logger::DEBUG
|
20
|
-
|
20
|
+
|
21
|
+
database_configuration = YAML.load_file(File.dirname(__FILE__) + '/database.yml')[adapter]
|
22
|
+
ActiveRecord::Base.configurations['test'] = database_configuration
|
21
23
|
ActiveRecord::Base.establish_connection(:test)
|
22
24
|
|
25
|
+
begin
|
26
|
+
ActiveRecord::Base.connection
|
27
|
+
rescue
|
28
|
+
# Ensures database exists.
|
29
|
+
ActiveRecord::Tasks::DatabaseTasks.database_configuration = database_configuration
|
30
|
+
ActiveRecord::Tasks::DatabaseTasks.create_current('test')
|
31
|
+
end
|
32
|
+
|
23
33
|
require File.dirname(__FILE__) + '/schema.rb'
|
24
34
|
|
25
35
|
Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each{ |file| require file }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mass_insert
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alejandro Gutiérrez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -111,6 +111,7 @@ files:
|
|
111
111
|
- test/adapters/postgresql/example_test.rb
|
112
112
|
- test/adapters/sqlite3/example_test.rb
|
113
113
|
- test/database.yml.example
|
114
|
+
- test/models/kind.rb
|
114
115
|
- test/models/user.rb
|
115
116
|
- test/schema.rb
|
116
117
|
- test/support/adapters/mysql2.rb
|
@@ -147,6 +148,7 @@ test_files:
|
|
147
148
|
- test/adapters/postgresql/example_test.rb
|
148
149
|
- test/adapters/sqlite3/example_test.rb
|
149
150
|
- test/database.yml.example
|
151
|
+
- test/models/kind.rb
|
150
152
|
- test/models/user.rb
|
151
153
|
- test/schema.rb
|
152
154
|
- test/support/adapters/mysql2.rb
|