upsert 2.2.0 → 2.2.1
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/CHANGELOG +7 -0
- data/README.md +8 -6
- data/lib/upsert/merge_function/PG_Connection.rb +2 -2
- data/lib/upsert/version.rb +1 -1
- data/upsert.gemspec +6 -1
- metadata +16 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0268cf71d5cdccb6336100af2ab5269affbec4c
|
4
|
+
data.tar.gz: 889d7278a2b046ab5848c76cec79a94d1dfa4ec6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 60420f2b09bf34a80277104589cb7ef3cf376548c2f65fcef2a3bed6b11559b50e42bb4cbdf358d850f305b962dc421f4cb873da0fb5ab4b14c6edc372ef498c
|
7
|
+
data.tar.gz: b4cbb08f7546fb13eb5eb784eb85c7ed3ecd93008f9cc0be31e05c17cc74ac160d5ea36bd0b7f39bd800982d35eff9bfeee00357b027d74142459fd99e7ed099
|
data/CHANGELOG
CHANGED
data/README.md
CHANGED
@@ -23,7 +23,7 @@ You pass a __selector__ that uniquely identifies a row, whether it exists or not
|
|
23
23
|
Syntax inspired by [mongo-ruby-driver's update method](http://api.mongodb.org/ruby/1.6.4/Mongo/Collection.html#update-instance_method).
|
24
24
|
|
25
25
|
### Basic
|
26
|
-
|
26
|
+
|
27
27
|
```ruby
|
28
28
|
connection = Mysql2::Client.new([...])
|
29
29
|
table_name = :pets
|
@@ -59,9 +59,11 @@ Batch mode is tested to be about 80% faster on PostgreSQL, MySQL, and SQLite3 th
|
|
59
59
|
|
60
60
|
### Native Postgres upsert
|
61
61
|
|
62
|
-
`INSERT ... ON CONFLICT DO UPDATE` is used when Postgres 9.5+ is detected and *unique
|
62
|
+
`INSERT ... ON CONFLICT DO UPDATE` is used when Postgres 9.5+ is detected and *unique constraint are in place.*
|
63
|
+
|
64
|
+
**Note: ** You must have a **unique constraint** on the column(s) you're using as a selector. A unique index won't work. See https://github.com/seamusabshere/upsert/issues/98#issuecomment-295341405 for more information and some ways to check.
|
63
65
|
|
64
|
-
If you don't have unique
|
66
|
+
If you don't have unique constraints, it will fall back to the classic Upsert gem user-defined function, which does not require a constraint.
|
65
67
|
|
66
68
|
### ActiveRecord helper method
|
67
69
|
|
@@ -173,7 +175,7 @@ BEGIN
|
|
173
175
|
DECLARE done BOOLEAN;
|
174
176
|
REPEAT
|
175
177
|
BEGIN
|
176
|
-
-- If there is a unique key constraint error then
|
178
|
+
-- If there is a unique key constraint error then
|
177
179
|
-- someone made a concurrent insert. Reset the sentinel
|
178
180
|
-- and try again.
|
179
181
|
DECLARE ER_DUP_UNIQUE CONDITION FOR 23000;
|
@@ -181,7 +183,7 @@ BEGIN
|
|
181
183
|
DECLARE CONTINUE HANDLER FOR ER_DUP_UNIQUE BEGIN
|
182
184
|
SET done = FALSE;
|
183
185
|
END;
|
184
|
-
|
186
|
+
|
185
187
|
DECLARE CONTINUE HANDLER FOR ER_INTEG BEGIN
|
186
188
|
SET done = TRUE;
|
187
189
|
END;
|
@@ -191,7 +193,7 @@ BEGIN
|
|
191
193
|
-- Race condition here. If a concurrent INSERT is made after
|
192
194
|
-- the SELECT but before the INSERT below we'll get a duplicate
|
193
195
|
-- key error. But the handler above will take care of that.
|
194
|
-
IF @count > 0 THEN
|
196
|
+
IF @count > 0 THEN
|
195
197
|
-- UPDATE table_name SET b = b_SET WHERE a = a_SEL;
|
196
198
|
UPDATE `pets` SET `name` = `name_set`, `tag_number` = `tag_number_set` WHERE `name` = `name_sel` AND `tag_number` = `tag_number_sel`;
|
197
199
|
ELSE
|
@@ -15,9 +15,9 @@ class Upsert
|
|
15
15
|
return @unique_index_on_selector if defined?(@unique_index_on_selector)
|
16
16
|
|
17
17
|
type_map = PG::TypeMapByColumn.new([PG::TextDecoder::Array.new])
|
18
|
-
schema_query.type_map = type_map
|
18
|
+
res = schema_query.tap { |r| r.type_map = type_map }
|
19
19
|
|
20
|
-
@unique_index_on_selector =
|
20
|
+
@unique_index_on_selector = res.values.any? do |row|
|
21
21
|
row.first.sort == selector_keys.sort
|
22
22
|
end
|
23
23
|
end
|
data/lib/upsert/version.rb
CHANGED
data/upsert.gemspec
CHANGED
@@ -24,7 +24,6 @@ Gem::Specification.new do |gem|
|
|
24
24
|
|
25
25
|
gem.add_development_dependency 'activerecord', '~>3'
|
26
26
|
gem.add_development_dependency 'active_record_inline_schema'
|
27
|
-
gem.add_development_dependency 'faker'
|
28
27
|
gem.add_development_dependency 'yard'
|
29
28
|
gem.add_development_dependency 'pry'
|
30
29
|
gem.add_development_dependency 'pg-hstore', ">=1.1.3"
|
@@ -57,4 +56,10 @@ Gem::Specification.new do |gem|
|
|
57
56
|
gem.add_development_dependency 'redcarpet', '~> 2.3.0'
|
58
57
|
end
|
59
58
|
end
|
59
|
+
|
60
|
+
if RUBY_VERSION <= '1.9.3'
|
61
|
+
gem.add_development_dependency 'faker', '1.6.3'
|
62
|
+
else
|
63
|
+
gem.add_development_dependency 'faker'
|
64
|
+
end
|
60
65
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: upsert
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Seamus Abshere
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-04-
|
12
|
+
date: 2017-04-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec-core
|
@@ -81,20 +81,6 @@ dependencies:
|
|
81
81
|
- - ">="
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '0'
|
84
|
-
- !ruby/object:Gem::Dependency
|
85
|
-
name: faker
|
86
|
-
requirement: !ruby/object:Gem::Requirement
|
87
|
-
requirements:
|
88
|
-
- - ">="
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
version: '0'
|
91
|
-
type: :development
|
92
|
-
prerelease: false
|
93
|
-
version_requirements: !ruby/object:Gem::Requirement
|
94
|
-
requirements:
|
95
|
-
- - ">="
|
96
|
-
- !ruby/object:Gem::Version
|
97
|
-
version: '0'
|
98
84
|
- !ruby/object:Gem::Dependency
|
99
85
|
name: yard
|
100
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -249,6 +235,20 @@ dependencies:
|
|
249
235
|
- - ">="
|
250
236
|
- !ruby/object:Gem::Version
|
251
237
|
version: '0'
|
238
|
+
- !ruby/object:Gem::Dependency
|
239
|
+
name: faker
|
240
|
+
requirement: !ruby/object:Gem::Requirement
|
241
|
+
requirements:
|
242
|
+
- - ">="
|
243
|
+
- !ruby/object:Gem::Version
|
244
|
+
version: '0'
|
245
|
+
type: :development
|
246
|
+
prerelease: false
|
247
|
+
version_requirements: !ruby/object:Gem::Requirement
|
248
|
+
requirements:
|
249
|
+
- - ">="
|
250
|
+
- !ruby/object:Gem::Version
|
251
|
+
version: '0'
|
252
252
|
description: Make it easy to upsert on MySQL, PostgreSQL, and SQLite3. Transparently
|
253
253
|
creates merge functions for MySQL and PostgreSQL; on SQLite3, uses INSERT OR IGNORE.
|
254
254
|
email:
|