dameng-rails 0.1.0 → 0.1.2
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/lib/dm_rails/introspection.rb +5 -2
- data/lib/dm_rails/version.rb +1 -1
- data/lib/dm_rails.rb +12 -0
- data/sql/dm_rails_columns.sql +8 -3
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: df58b701f21045bf213bcb68f55f666f438392f5f3dc98f4288f4446cf4ed19c
|
|
4
|
+
data.tar.gz: aca1b8c49c32adec34ef0991b945e50924325d9b53da25da4c75966a52d89cd0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: dcdde8463487934af0b6ca03c593b34e5bc129c440f6e2bf7640b77da63ba18d421f13c9de0bf017fb82dcfdc6322092c1ffe99c5c86d4f12c47757b9a917bc1
|
|
7
|
+
data.tar.gz: 7bf19ae686f0c53a9869e81c764ccad859bbbb479bf8aaded99dca0e568e9bfaa7068f848c69c4f10624e7e44f8fca4a5ed365add652bac8483e9853ed6d4e3f
|
|
@@ -9,11 +9,14 @@ module DmRails
|
|
|
9
9
|
# 表清单用代理可自答的 SHOW TABLES。
|
|
10
10
|
module Introspection
|
|
11
11
|
def column_definitions(table_name)
|
|
12
|
+
tbl = table_name.to_s.downcase
|
|
13
|
+
json_cols = DmRails.json_columns.fetch(tbl, [])
|
|
12
14
|
sql = "SELECT fld, ctype, is_null, key_kind, def_val, extra_str FROM #{DmRails.view_name} " \
|
|
13
|
-
"WHERE tbl = #{quote(
|
|
15
|
+
"WHERE tbl = #{quote(tbl)} ORDER BY col_order"
|
|
14
16
|
execute(sql, "SCHEMA").to_a.map do |row|
|
|
15
17
|
vals = row.is_a?(Hash) ? row.values : row
|
|
16
|
-
|
|
18
|
+
ctype = json_cols.include?(vals[0]) ? "json" : vals[1]
|
|
19
|
+
{ Field: vals[0], Type: ctype, Collation: "", Null: vals[2],
|
|
17
20
|
Key: vals[3].to_s, Default: dm_rails_normalize_default(vals[4]), Extra: vals[5].to_s,
|
|
18
21
|
Privileges: "", Comment: "" }
|
|
19
22
|
end
|
data/lib/dm_rails/version.rb
CHANGED
data/lib/dm_rails.rb
CHANGED
|
@@ -19,6 +19,18 @@ module DmRails
|
|
|
19
19
|
ENV.fetch("DM_RAILS_VIEW", "dm_rails_columns")
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
# MySQL 原生 JSON 类型列(迁达梦后落为 TEXT,需向 AR 上报 json 类型以恢复 Hash 自动序列化)。
|
|
23
|
+
# 通过 ENV["DM_RAILS_JSON_COLUMNS"] 配置,格式:"table.col,table2.col2";
|
|
24
|
+
# 也可在应用初始化时直接赋值 DmRails.json_columns = { "table" => ["col"] }
|
|
25
|
+
attr_writer :json_columns
|
|
26
|
+
|
|
27
|
+
def json_columns
|
|
28
|
+
@json_columns ||= ENV.fetch("DM_RAILS_JSON_COLUMNS", "").split(",").each_with_object({}) do |pair, h|
|
|
29
|
+
tbl, col = pair.strip.split(".", 2)
|
|
30
|
+
(h[tbl] ||= []) << col if tbl && col
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
22
34
|
# 达梦侧辅助视图的建视图 SQL(用达梦客户端在业务 schema 下执行,勿经代理执行)
|
|
23
35
|
def view_sql
|
|
24
36
|
File.read(File.expand_path("../sql/dm_rails_columns.sql", __dir__))
|
data/sql/dm_rails_columns.sql
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
-- dm-rails 辅助视图:为 ActiveRecord 提供 MySQL 风格的列结构信息
|
|
2
|
+
-- 主键用预聚合 LEFT JOIN,勿改回相关子查询(后者在达梦上可慢 3 个数量级)
|
|
2
3
|
-- 在达梦业务 schema 下用达梦客户端执行(勿经代理执行);视图名可通过 DM_RAILS_VIEW 环境变量对应调整
|
|
3
4
|
CREATE OR REPLACE VIEW dm_rails_columns AS
|
|
4
5
|
SELECT LOWER(c.TABLE_NAME) AS tbl,
|
|
@@ -22,9 +23,13 @@ SELECT LOWER(c.TABLE_NAME) AS tbl,
|
|
|
22
23
|
ELSE 'varchar(255)'
|
|
23
24
|
END AS ctype,
|
|
24
25
|
CASE c.NULLABLE WHEN 'Y' THEN 'YES' ELSE 'NO' END AS is_null,
|
|
25
|
-
|
|
26
|
-
WHERE uc.CONSTRAINT_TYPE = 'P' AND cu.TABLE_NAME = c.TABLE_NAME AND cu.COLUMN_NAME = c.COLUMN_NAME AND ROWNUM <= 1), '') AS key_kind,
|
|
26
|
+
CASE WHEN pk.COLUMN_NAME IS NOT NULL THEN 'PRI' ELSE '' END AS key_kind,
|
|
27
27
|
c.DATA_DEFAULT AS def_val,
|
|
28
28
|
CASE WHEN LOWER(c.COLUMN_NAME) = 'id' THEN 'auto_increment' ELSE '' END AS extra_str,
|
|
29
29
|
c.COLUMN_ID AS col_order
|
|
30
|
-
FROM USER_TAB_COLUMNS c
|
|
30
|
+
FROM USER_TAB_COLUMNS c
|
|
31
|
+
LEFT JOIN (SELECT DISTINCT cu.TABLE_NAME, cu.COLUMN_NAME
|
|
32
|
+
FROM USER_CONS_COLUMNS cu
|
|
33
|
+
JOIN USER_CONSTRAINTS uc ON cu.CONSTRAINT_NAME = uc.CONSTRAINT_NAME
|
|
34
|
+
WHERE uc.CONSTRAINT_TYPE = 'P') pk
|
|
35
|
+
ON pk.TABLE_NAME = c.TABLE_NAME AND pk.COLUMN_NAME = c.COLUMN_NAME;
|