Enviar búsqueda
Cargar
ActiveRecordでレガシーテーブルにつないだ話
•
1 recomendación
•
2,023 vistas
ryonext Shimamoto
Seguir
Tecnología
Denunciar
Compartir
Denunciar
Compartir
1 de 21
Descargar ahora
Descargar para leer sin conexión
Recomendados
お手軽並列処理
お手軽並列処理
博文 斉藤
Go と Couchbase で microservices を作るには?
Go と Couchbase で microservices を作るには?
Yusuke Komatsu
Hakyll
Hakyll
Kazufumi Ohkawa
書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所
書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所
Yu Sugawara
Integral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common Lisp
fukamachi
PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合
hiboma
静岡のHaskellerはEmacsを使う
静岡のHaskellerはEmacsを使う
Kazufumi Ohkawa
Shelly
Shelly
fukamachi
Recomendados
お手軽並列処理
お手軽並列処理
博文 斉藤
Go と Couchbase で microservices を作るには?
Go と Couchbase で microservices を作るには?
Yusuke Komatsu
Hakyll
Hakyll
Kazufumi Ohkawa
書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所
書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所
Yu Sugawara
Integral - New O/R Mapper for Common Lisp
Integral - New O/R Mapper for Common Lisp
fukamachi
PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合
hiboma
静岡のHaskellerはEmacsを使う
静岡のHaskellerはEmacsを使う
Kazufumi Ohkawa
Shelly
Shelly
fukamachi
2017年春のPerl
2017年春のPerl
charsbar
実践Realm
実践Realm
Yu Sugawara
Elixir Meetup #1 Loggerの構造と拡張
Elixir Meetup #1 Loggerの構造と拡張
Sugawara Genki
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
Mori Shingo
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
m2ym
Haskell超初心者勉強会11
Haskell超初心者勉強会11
Takashi Kawachi
awk v.s. bashどっちが強い?@OSC2011Tokyo
awk v.s. bashどっちが強い?@OSC2011Tokyo
Ryuichi Ueda
Siphone coffeemaker okayama-js-1
Siphone coffeemaker okayama-js-1
NISHIMOTO Keisuke
NodeFest2014 - Transpiler
NodeFest2014 - Transpiler
Martin Heidegger
serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例
Koichi Shimozono
Fabric
Fabric
Joe_noh
ocamloptの全体像
ocamloptの全体像
Kiwamu Okabe
AOSPをミラーしてみた
AOSPをミラーしてみた
kinneko
CHP survey
CHP survey
Makoto Kishimoto
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
博文 斉藤
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
Kohei Hoshi
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
pythonでオフィス快適化計画
pythonでオフィス快適化計画
Kazufumi Ohkawa
MySQL clients
MySQL clients
yoku0825
OpenStack を 拡張する NetApp Unified Driver の使い方 Vol.001
OpenStack を 拡張する NetApp Unified Driver の使い方 Vol.001
Takeshi Kuramochi
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
Insight Technology, Inc.
Maatkit で MySQL チューニング
Maatkit で MySQL チューニング
Kensuke Nagae
Más contenido relacionado
La actualidad más candente
2017年春のPerl
2017年春のPerl
charsbar
実践Realm
実践Realm
Yu Sugawara
Elixir Meetup #1 Loggerの構造と拡張
Elixir Meetup #1 Loggerの構造と拡張
Sugawara Genki
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
Mori Shingo
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
m2ym
Haskell超初心者勉強会11
Haskell超初心者勉強会11
Takashi Kawachi
awk v.s. bashどっちが強い?@OSC2011Tokyo
awk v.s. bashどっちが強い?@OSC2011Tokyo
Ryuichi Ueda
Siphone coffeemaker okayama-js-1
Siphone coffeemaker okayama-js-1
NISHIMOTO Keisuke
NodeFest2014 - Transpiler
NodeFest2014 - Transpiler
Martin Heidegger
serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例
Koichi Shimozono
Fabric
Fabric
Joe_noh
ocamloptの全体像
ocamloptの全体像
Kiwamu Okabe
AOSPをミラーしてみた
AOSPをミラーしてみた
kinneko
CHP survey
CHP survey
Makoto Kishimoto
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
博文 斉藤
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
Kohei Hoshi
La actualidad más candente
(16)
2017年春のPerl
2017年春のPerl
実践Realm
実践Realm
Elixir Meetup #1 Loggerの構造と拡張
Elixir Meetup #1 Loggerの構造と拡張
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
Haskell超初心者勉強会11
Haskell超初心者勉強会11
awk v.s. bashどっちが強い?@OSC2011Tokyo
awk v.s. bashどっちが強い?@OSC2011Tokyo
Siphone coffeemaker okayama-js-1
Siphone coffeemaker okayama-js-1
NodeFest2014 - Transpiler
NodeFest2014 - Transpiler
serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例
Fabric
Fabric
ocamloptの全体像
ocamloptの全体像
AOSPをミラーしてみた
AOSPをミラーしてみた
CHP survey
CHP survey
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
Similar a ActiveRecordでレガシーテーブルにつないだ話
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
pythonでオフィス快適化計画
pythonでオフィス快適化計画
Kazufumi Ohkawa
MySQL clients
MySQL clients
yoku0825
OpenStack を 拡張する NetApp Unified Driver の使い方 Vol.001
OpenStack を 拡張する NetApp Unified Driver の使い方 Vol.001
Takeshi Kuramochi
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
Insight Technology, Inc.
Maatkit で MySQL チューニング
Maatkit で MySQL チューニング
Kensuke Nagae
More Better Nested Set
More Better Nested Set
xibbar
入門機械学習1,2章
入門機械学習1,2章
Kazufumi Ohkawa
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
Web技術勉強会 第38回
Web技術勉強会 第38回
龍一 田中
卒研発表
卒研発表
yayugu
Ansible入門
Ansible入門
Akira Otsuka
ふくよかなモデル
ふくよかなモデル
yukaina
What's Temporal model FuelPHP東京勉強会03
What's Temporal model FuelPHP東京勉強会03
Takayuki Yamaguchi
Ruby 2.5
Ruby 2.5
Masahiro Tomita
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
Insight Technology, Inc.
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews, Inc.
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
sohta
Index shotgun on mysql5.6
Index shotgun on mysql5.6
yoku0825
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
Similar a ActiveRecordでレガシーテーブルにつないだ話
(20)
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
pythonでオフィス快適化計画
pythonでオフィス快適化計画
MySQL clients
MySQL clients
OpenStack を 拡張する NetApp Unified Driver の使い方 Vol.001
OpenStack を 拡張する NetApp Unified Driver の使い方 Vol.001
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
Maatkit で MySQL チューニング
Maatkit で MySQL チューニング
More Better Nested Set
More Better Nested Set
入門機械学習1,2章
入門機械学習1,2章
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Web技術勉強会 第38回
Web技術勉強会 第38回
卒研発表
卒研発表
Ansible入門
Ansible入門
ふくよかなモデル
ふくよかなモデル
What's Temporal model FuelPHP東京勉強会03
What's Temporal model FuelPHP東京勉強会03
Ruby 2.5
Ruby 2.5
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
Index shotgun on mysql5.6
Index shotgun on mysql5.6
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Último
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
CRI Japan, Inc.
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Toru Tamaki
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
sn679259
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Hiroshi Tomioka
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Toru Tamaki
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
atsushi061452
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
CRI Japan, Inc.
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
WSO2
Último
(12)
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
ActiveRecordでレガシーテーブルにつないだ話
1.
ActiveRecordでレガシーテーブル に繋いだらスタンド攻撃を受けた話 @ryonext
2.
• タイトルは釣りです
3.
自己紹介 • Twitter ID @ryonext • ハンターランク151のモンハン厨です • 新横浜にあるOA機器メーカーでビデオ会議のシステム 作ってます • RailsでAPIとかテスト書いたりとか
4.
ActiveRecordは便利ですね 1 class CreateUsers
< ActiveRecord::Migration! 2 def change! 3 create_table :users do |t|! 4 t.string :name! 5 t.integer :age! 6 t.string :type! 7 ! 8 t.timestamps! 9 end! 10 end! 11 end
5.
14 15 16 17 18 19 20 21 22 23 24 ActiveRecord::Schema.define(version: 20131116064854) do! ! create_table
"users", force: true do |t|! t.string "name"! t.integer "age"! t.string "type"! t.datetime "created_at"! t.datetime "updated_at"! end! ! end
6.
mysql> desc users; +------------+--------------+------+-----+---------+----------------+ |
Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | age | int(11) | YES | | NULL | | | type | varchar(255) | YES | | NULL | | | created_at | datetime | YES | | NULL | | | updated_at | datetime | YES | | NULL | | +------------+--------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec)
7.
ActiveRecordの規約に沿ってい ないテーブル +--------------------+ | Tables_in_legacydb | +--------------------+ |
legacy_user | +--------------------+ mysql> desc legacy_user; +-------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------------+--------------+------+-----+---------+-------+ | userID | int(11) | NO | PRI | 0 | | | name | varchar(255) | YES | | NULL | | | age | int(11) | YES | | NULL | | | someLegacyParams1 | varchar(255) | YES | | NULL | | | someLegacyParams2 | varchar(255) | YES | | NULL | | | someLegacyParams3 | varchar(255) | YES | | NULL | | +-------------------+--------------+------+-----+---------+-------+ 6 rows in set (0.00 sec)
8.
こんな感じでつなげます config/database.yml 14 legacy:! 15 adapter: mysql2! 16 database:
legacyDB! 17 username: root! 18 password:! 19 pool: 5! 20 timeout: 5000 app/models/legacy_user.rb 1 class LegacyUser < ActiveRecord::Base! 2 establish_connection(:legacy)! 3 self.table_name = "legacy_user"! 4 end
9.
ただし
10.
こんなテーブルが合ったとする mysql> desc hyper_legacy_tbl; +-----------+---------+------+-----+---------+-------+ |
Field | Type | Null | Key | Default | Extra | +-----------+---------+------+-----+---------+-------+ | legacy_id | int(11) | NO | PRI | 0 | | | id | int(11) | YES | | NULL | | +-----------+---------+------+-----+---------+-------+ 2 rows in set (0.01 sec) ‘id’というカラムをもつが、主キーではなく普通のカラム
11.
つないでみる 1 class HyperLegacyTbl
< ActiveRecord::Base! 2 establish_connection(:legacy)! 3 self.table_name = "hyper_legacy_tbl"! 4 end
12.
繋がったようにみえる [5] pry(main)> h
= HyperLegacyTbl.new => #<HyperLegacyTbl legacy_id: 0, id: nil>
13.
‘id’を更新してみる [6] pry(main)> h.id
= 100 => 100 [7] pry(main)> h.save
14.
ファッ!? (0.2ms) BEGIN SQL (0.3ms)
INSERT INTO `hyper_legacy_tbl` (`legacy_id`) VALUES (100) (0.1ms) COMMIT => true [8] pry(main)> h => #<HyperLegacyTbl legacy_id: 100, id: nil>
15.
16.
なぜなのか • “#id”によるアクセスはprimary_keyへのアクセスになっ ている • “id”という名前のパラメータへのアクセスではない
17.
対処:既存レコードの場合 取得には“#attributes[“id”]”を使う [36] pry(main)> h
= HyperLegacyTbl.first HyperLegacyTbl Load (0.4ms) SELECT `hyper_legacy_tbl`.* FROM `hyper_legacy_tbl` ORDER BY `hyper_legacy_tbl`.`legacy_id` ASC LIMIT 1 => #<HyperLegacyTbl legacy_id: 100, id: 200> [37] pry(main)> h.id => 100 [38] pry(main)> h.legacy_id => 100 [39] pry(main)> h.attributes["id"] => 200
18.
対処:既存レコードの場合 更新には“update_column”を使う [45] pry(main)> h.update_column("id",
1000) SQL (0.3ms) UPDATE `hyper_legacy_tbl` SET `hyper_legacy_tbl`.`id` = 1000 WHERE `hyper_legacy_tbl`.`legacy_id` = 100 => true ただし、データを取りなおさないで2連続でやると失敗する [46] pry(main)> h.update_column("id", 3000) SQL (0.3ms) UPDATE `hyper_legacy_tbl` SET `hyper_legacy_tbl`.`id` = 3000 WHERE `hyper_legacy_tbl`.`legacy_id` = 1000 => false
19.
新規の場合 • Insertのときはupdate_columnが使えないので違う方法 が必要?(未調査) • 直接SQLを発行してしまえば • それもうActiveRecordつかわなくていいよね説
20.
どこで定義されているのか • #id • lib/active_record/attribute_methods/primary_key.rb • • #define_method_attribute(attr_name) #id= • lib/active_record/attribute_methods/write.rb • #write_attribute(attr_name, value)
21.
まとめ • ‘id’っていう名前を持つテーブルにActiveRecordでつな ぐときは注意しましょう
Descargar ahora