activerecord-import 1.0.6 → 1.0.7
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/.gitignore +1 -0
- data/CHANGELOG.md +12 -3
- data/README.markdown +15 -14
- data/activerecord-import.gemspec +1 -1
- data/benchmarks/schema/{mysql_schema.rb → mysql2_schema.rb} +0 -0
- data/lib/activerecord-import/adapters/mysql_adapter.rb +2 -2
- data/lib/activerecord-import/import.rb +9 -4
- data/lib/activerecord-import/version.rb +1 -1
- data/test/import_test.rb +10 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fdf26ba513a4d3365d24cf9b2bf1fc814db9918d06ccdb91c5f32dec026fb7b7
|
4
|
+
data.tar.gz: 35ba31f95ef4b585cbe8ca4b0819d8ddc1ba50b12db6a70d3be2352669fd9289
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ef741e92b76c9705c63145b58351e82813eb71b003993a73cff5db2d0779d6dc14b48d4dc43a354ad8ba6a24a6acd2aa54bdf167775dee8e0404db4905c03f2
|
7
|
+
data.tar.gz: f8634e6ae1e9345ca9b1d68bca8fe4e67c04b1ae51101fdf97608a609d1fc349737d424ce23f809548d4e6a42931eb38d246d6be354acf49282fcaf20d827fa0
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## Changes in 1.0.7
|
2
|
+
|
3
|
+
* Use @@max_allowed_packet session variable instead of querying SHOW VARIABLES. Thanks to @diclophis via \#706.
|
4
|
+
* Add option :track_validation_failures. When this is set to true, failed_instances will be an array of arrays, with each inner array having the form [:index_in_dataset, :object_with_errors]. Thanks to @rorymckinley via \#684.
|
5
|
+
|
6
|
+
### Fixes
|
7
|
+
|
8
|
+
* Prevent mass-assignment errors in Rails strict mode. Thanks to @diclophis via \##709.
|
9
|
+
|
1
10
|
## Changes in 1.0.6
|
2
11
|
|
3
12
|
### Fixes
|
@@ -5,7 +14,7 @@
|
|
5
14
|
* Handle after_initialize callbacks. Thanks to @AhMohsen46 via \#691 and
|
6
15
|
\#692.
|
7
16
|
* Fix regression introduced in 1.0.4. Explicity allow adapters to
|
8
|
-
support on duplicate key update. Thanks to @dsobiera, @jkowens via \#
|
17
|
+
support on duplicate key update. Thanks to @dsobiera, @jkowens via \#696.
|
9
18
|
|
10
19
|
## Changes in 1.0.5
|
11
20
|
|
@@ -283,7 +292,7 @@
|
|
283
292
|
Thanks to @jkowens via \#301.
|
284
293
|
* Allow for custom timestamp columns. Thanks to @mojidabckuu, @jkowens
|
285
294
|
via \#401.
|
286
|
-
|
295
|
+
|
287
296
|
### Fixes
|
288
297
|
|
289
298
|
* Fix ActiveRecord 5 issue coercing boolean values when serializing
|
@@ -295,7 +304,7 @@
|
|
295
304
|
|
296
305
|
* Fix issue where PostgreSQL cannot recognize columns if names
|
297
306
|
include mixed case characters. Thanks to @hugobgranja via \#379.
|
298
|
-
* Fix an issue for ActiveRecord 5 where serialized fields with
|
307
|
+
* Fix an issue for ActiveRecord 5 where serialized fields with
|
299
308
|
default values were not being typecast. Thanks to @whistlerbrk,
|
300
309
|
@jkowens via \#386.
|
301
310
|
* Add option :force_single_insert for MySQL to make sure a single
|
data/README.markdown
CHANGED
@@ -250,20 +250,21 @@ Book.import books, recursive: true
|
|
250
250
|
|
251
251
|
### Options
|
252
252
|
|
253
|
-
Key
|
254
|
-
|
255
|
-
:validate
|
256
|
-
:validate_uniqueness
|
257
|
-
:validate_with_context
|
258
|
-
:
|
259
|
-
:
|
260
|
-
:
|
261
|
-
:
|
262
|
-
:
|
263
|
-
:
|
264
|
-
:
|
265
|
-
:
|
266
|
-
:
|
253
|
+
Key | Options | Default | Description
|
254
|
+
------------------------- | --------------------- | ------------------ | -----------
|
255
|
+
:validate | `true`/`false` | `true` | Whether or not to run `ActiveRecord` validations (uniqueness skipped). This option will always be true when using `import!`.
|
256
|
+
:validate_uniqueness | `true`/`false` | `false` | Whether or not to run uniqueness validations, has potential pitfalls, use with caution (requires `>= v0.27.0`).
|
257
|
+
:validate_with_context | `Symbol` |`:create`/`:update` | Allows passing an ActiveModel validation context for each model. Default is `:create` for new records and `:update` for existing ones.
|
258
|
+
:track_validation_failures| `true`/`false` | `false` | When this is set to true, `failed_instances` will be an array of arrays, with each inner array having the form `[:index_in_dataset, :object_with_errors]`
|
259
|
+
:on_duplicate_key_ignore | `true`/`false` | `false` | Allows skipping records with duplicate keys. See [here](https://github.com/zdennis/activerecord-import/#duplicate-key-ignore) for more details.
|
260
|
+
:ignore | `true`/`false` | `false` | Alias for :on_duplicate_key_ignore.
|
261
|
+
:on_duplicate_key_update | :all, `Array`, `Hash` | N/A | Allows upsert logic to be used. See [here](https://github.com/zdennis/activerecord-import/#duplicate-key-update) for more details.
|
262
|
+
:synchronize | `Array` | N/A | An array of ActiveRecord instances. This synchronizes existing instances in memory with updates from the import.
|
263
|
+
:timestamps | `true`/`false` | `true` | Enables/disables timestamps on imported records.
|
264
|
+
:recursive | `true`/`false` | `false` | Imports has_many/has_one associations (PostgreSQL only).
|
265
|
+
:batch_size | `Integer` | total # of records | Max number of records to insert per import
|
266
|
+
:raise_error | `true`/`false` | `false` | Raises an exception at the first invalid record. This means there will not be a result object returned. The `import!` method is a shortcut for this.
|
267
|
+
:all_or_none | `true`/`false` | `false` | Will not import any records if there is a record with validation errors.
|
267
268
|
|
268
269
|
#### Duplicate Key Ignore
|
269
270
|
|
data/activerecord-import.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.email = ["zach.dennis@gmail.com"]
|
7
7
|
gem.summary = "Bulk insert extension for ActiveRecord"
|
8
8
|
gem.description = "A library for bulk inserting data using ActiveRecord."
|
9
|
-
gem.homepage = "
|
9
|
+
gem.homepage = "https://github.com/zdennis/activerecord-import"
|
10
10
|
gem.license = "MIT"
|
11
11
|
|
12
12
|
gem.files = `git ls-files`.split($\)
|
File without changes
|
@@ -56,9 +56,9 @@ module ActiveRecord::Import::MysqlAdapter
|
|
56
56
|
# in a single packet
|
57
57
|
def max_allowed_packet # :nodoc:
|
58
58
|
@max_allowed_packet ||= begin
|
59
|
-
result = execute( "
|
59
|
+
result = execute( "SELECT @@max_allowed_packet" )
|
60
60
|
# original Mysql gem responds to #fetch_row while Mysql2 responds to #first
|
61
|
-
val = result.respond_to?(:fetch_row) ? result.fetch_row[
|
61
|
+
val = result.respond_to?(:fetch_row) ? result.fetch_row[0] : result.first[0]
|
62
62
|
val.to_i
|
63
63
|
end
|
64
64
|
end
|
@@ -547,7 +547,7 @@ class ActiveRecord::Base
|
|
547
547
|
alias import! bulk_import! unless ActiveRecord::Base.respond_to? :import!
|
548
548
|
|
549
549
|
def import_helper( *args )
|
550
|
-
options = { validate: true, timestamps: true }
|
550
|
+
options = { validate: true, timestamps: true, track_validation_failures: false }
|
551
551
|
options.merge!( args.pop ) if args.last.is_a? Hash
|
552
552
|
# making sure that current model's primary key is used
|
553
553
|
options[:primary_key] = primary_key
|
@@ -703,13 +703,18 @@ class ActiveRecord::Base
|
|
703
703
|
# keep track of the instance and the position it is currently at. if this fails
|
704
704
|
# validation we'll use the index to remove it from the array_of_attributes
|
705
705
|
arr.each_with_index do |hsh, i|
|
706
|
-
|
706
|
+
# utilize block initializer syntax to prevent failure when 'mass_assignment_sanitizer = :strict'
|
707
|
+
model = new do |m|
|
708
|
+
hsh.each_pair { |k, v| m[k] = v }
|
709
|
+
end
|
710
|
+
|
707
711
|
next if validator.valid_model?(model)
|
708
712
|
raise(ActiveRecord::RecordInvalid, model) if options[:raise_error]
|
713
|
+
|
709
714
|
array_of_attributes[i] = nil
|
710
715
|
failure = model.dup
|
711
716
|
failure.errors.send(:initialize_dup, model.errors)
|
712
|
-
failed_instances << failure
|
717
|
+
failed_instances << (options[:track_validation_failures] ? [i, failure] : failure )
|
713
718
|
end
|
714
719
|
array_of_attributes.compact!
|
715
720
|
end
|
@@ -807,7 +812,7 @@ class ActiveRecord::Base
|
|
807
812
|
result = connection.insert_many( [insert_sql, post_sql_statements].flatten,
|
808
813
|
batch_values,
|
809
814
|
options,
|
810
|
-
"#{model_name} Create Many
|
815
|
+
"#{model_name} Create Many" )
|
811
816
|
number_inserted += result.num_inserts
|
812
817
|
ids += result.ids
|
813
818
|
results += result.results
|
data/test/import_test.rb
CHANGED
@@ -252,6 +252,16 @@ describe "#import" do
|
|
252
252
|
end
|
253
253
|
end
|
254
254
|
|
255
|
+
it "should index the failed instances by their poistion in the set if `track_failures` is true" do
|
256
|
+
index_offset = valid_values.length
|
257
|
+
results = Topic.import columns, valid_values + invalid_values, validate: true, track_validation_failures: true
|
258
|
+
assert_equal invalid_values.size, results.failed_instances.size
|
259
|
+
invalid_values.each_with_index do |value_set, index|
|
260
|
+
assert_equal index + index_offset, results.failed_instances[index].first
|
261
|
+
assert_equal value_set.first, results.failed_instances[index].last.title
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
255
265
|
it "should set ids in valid models if adapter supports setting primary key of imported objects" do
|
256
266
|
if ActiveRecord::Base.supports_setting_primary_key_of_imported_objects?
|
257
267
|
Topic.import (invalid_models + valid_models), validate: true
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-import
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zach Dennis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -67,7 +67,7 @@ files:
|
|
67
67
|
- benchmarks/models/test_innodb.rb
|
68
68
|
- benchmarks/models/test_memory.rb
|
69
69
|
- benchmarks/models/test_myisam.rb
|
70
|
-
- benchmarks/schema/
|
70
|
+
- benchmarks/schema/mysql2_schema.rb
|
71
71
|
- gemfiles/3.2.gemfile
|
72
72
|
- gemfiles/4.0.gemfile
|
73
73
|
- gemfiles/4.1.gemfile
|
@@ -167,7 +167,7 @@ files:
|
|
167
167
|
- test/travis/database.yml
|
168
168
|
- test/value_sets_bytes_parser_test.rb
|
169
169
|
- test/value_sets_records_parser_test.rb
|
170
|
-
homepage:
|
170
|
+
homepage: https://github.com/zdennis/activerecord-import
|
171
171
|
licenses:
|
172
172
|
- MIT
|
173
173
|
metadata: {}
|
@@ -186,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
186
186
|
- !ruby/object:Gem::Version
|
187
187
|
version: '0'
|
188
188
|
requirements: []
|
189
|
-
rubygems_version: 3.0.
|
189
|
+
rubygems_version: 3.0.8
|
190
190
|
signing_key:
|
191
191
|
specification_version: 4
|
192
192
|
summary: Bulk insert extension for ActiveRecord
|