sequel-mysql_generated_columns 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/README.md +18 -6
- data/lib/sequel/extensions/mysql_generated_columns.rb +2 -45
- data/sequel-mysql_generated_columns.gemspec +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f89990321a4c7b4523b5e3065df8106095d85a75
|
4
|
+
data.tar.gz: bba7a2bb5d8309a441d4c78bbc01b6eefda23b69
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5315b306cb5247eb13602a9a41c7295c9e6e419ea43203a25556804ba508404df6a2c533f12267b90148acd2806851e14b80736ac646758550471ac891c3be81
|
7
|
+
data.tar.gz: ade24da7fcb5a53687d224a8f766be398622993b4c7acbb856da39a941eefa15333a32c9be7301e2ea96099f3e052d83dd2856cfe40fe992b80db1997870e45d
|
data/README.md
CHANGED
@@ -3,18 +3,22 @@
|
|
3
3
|
Sequel extension that adds support for MySQL generated columns (added first on
|
4
4
|
MySQL 5.7.5).
|
5
5
|
|
6
|
-
When enabled,
|
7
|
-
`#
|
6
|
+
When enabled, it allows passing an SQL expression with the option `:as` to
|
7
|
+
`#column` and `#add_column` methods, inside `DB#create_table` and
|
8
|
+
`DB#alter_table` blocks.
|
8
9
|
|
9
10
|
## Example
|
10
11
|
|
12
|
+
When used in a `create_table` block:
|
13
|
+
|
11
14
|
```ruby
|
12
15
|
create_table(:triangles) do
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
+
integer :a
|
17
|
+
integer :b
|
18
|
+
integer :c, :as => :sqrt.sql_function(:a*:a + :b*:b)
|
16
19
|
end
|
17
20
|
```
|
21
|
+
This will generate the following SQL statement:
|
18
22
|
|
19
23
|
```sql
|
20
24
|
CREATE TABLE `triangles` (
|
@@ -24,16 +28,24 @@ CREATE TABLE `triangles` (
|
|
24
28
|
)
|
25
29
|
```
|
26
30
|
|
31
|
+
In this example, after creating a table with a single JSON column, the next
|
32
|
+
`alter_table` block:
|
33
|
+
|
27
34
|
```ruby
|
28
35
|
create_table(:docs) do
|
29
36
|
json :doc
|
30
37
|
end
|
31
38
|
|
32
39
|
alter_table(:docs) do
|
33
|
-
|
40
|
+
add_column :id, Integer, :as => :json_extract.sql_function(:doc, '$.id'),
|
41
|
+
:stored => true,
|
42
|
+
:primary_key => true
|
34
43
|
end
|
35
44
|
```
|
36
45
|
|
46
|
+
will add a stored generated column with a primary key over the JSON object
|
47
|
+
property `id` in from the JSON document stored in column `doc`:
|
48
|
+
|
37
49
|
```sql
|
38
50
|
CREATE TABLE `documents` (`doc` json)
|
39
51
|
ALTER TABLE `documents` ADD COLUMN `id` integer AS (json_extract(`doc`, '$.id')) STORED PRIMARY KEY
|
@@ -9,55 +9,12 @@ module Sequel
|
|
9
9
|
NOT_NULL = ' NOT NULL'.freeze
|
10
10
|
PRIMARY_KEY = ' PRIMARY KEY'.freeze
|
11
11
|
|
12
|
-
# Additional methods for the create_table generator to support constraint validations.
|
13
|
-
module CreateTableGeneratorMethods
|
14
|
-
def generated_column(name, type, expr, opts={})
|
15
|
-
index_opts = opts.delete(:index)
|
16
|
-
columns << {:name => name, :type => type, :expr => expr, :gen => true}.merge!(opts)
|
17
|
-
if index_opts
|
18
|
-
index(name, index_opts.is_a?(Hash) ? index_opts : {})
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# Additional methods for the alter_table generator to support constraint validations,
|
24
|
-
# used to give it a more similar API to the create_table generator.
|
25
|
-
module AlterTableGeneratorMethods
|
26
|
-
include CreateTableGeneratorMethods
|
27
|
-
|
28
|
-
# Add a generated column with the given name, type, and opts to the DDL for the table.
|
29
|
-
#
|
30
|
-
# add_generated_column(:name, String, Sequel.function(:sum, :a, :b)) # ADD COLUMN name varchar(255) AS (SUM(a, b))
|
31
|
-
def add_generated_column(name, type, expr, opts={})
|
32
|
-
@operations << {:op => :add_column, :name => name, :type => type, :expr => expr, :gen => true}.merge!(opts)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
# Modify the default create_table generator to include
|
37
|
-
# the generated columns methods.
|
38
|
-
def create_table_generator(&block)
|
39
|
-
super do
|
40
|
-
extend CreateTableGeneratorMethods
|
41
|
-
@generated_columns = []
|
42
|
-
instance_eval(&block) if block
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Modify the default alter_table generator to include
|
47
|
-
# the generated columns methods.
|
48
|
-
def alter_table_generator(&block)
|
49
|
-
super do
|
50
|
-
extend AlterTableGeneratorMethods
|
51
|
-
instance_eval(&block) if block
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
12
|
# Modify column definition generator method to support generated columns
|
56
13
|
def column_definition_sql(column)
|
57
|
-
if column[:
|
14
|
+
if expr = column[:as]
|
58
15
|
sql = String.new
|
59
16
|
sql << "#{quote_identifier(column[:name])} #{type_literal(column)}"
|
60
|
-
sql << " AS (#{literal(
|
17
|
+
sql << " AS (#{literal(expr)})"
|
61
18
|
generated_column_definition_order.each{|m| send(:"generated_column_definition_#{m}_sql", sql, column)}
|
62
19
|
sql
|
63
20
|
else
|