🎉
postgresql から sqlite3に移す作業について (後編)
見よう見真似に
基本的に深い理解はしていません。何をしているかは理解しているつもり
- 前編で取り敢えず posgresql の既存DBを読み出すところまで railsアプリをでっち上げられた。
- 後編では、既存DBのデータから sqlite3に流し込んで取り敢えず〆。
- rails の力を借りる。
- そして、railsで仕事されている方のチカラをたくさん借りる。
別のアプリに。
そもそもDBを挿げ替える作業はあまりしないと思う・・・
- rails new dbconv (...ベタな名前)
- デフォルトで rails プロジェクトを立ち上げると sqlite3 アダプタしか入らない。。
- 前編で作った schema.rb は持っていく。
- Gemfile に gem "pg" 。
- ”gem install pg” 。
- config/database.yml を変更
# SQLite. Versions 3.8.0 and up are supported.
# gem install sqlite3
#
# Ensure the SQLite 3 gem is defined in your Gemfile
# gem "sqlite3"
#
development:
primary:
database: storage/development.sqlite3
adapter: sqlite3
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
timeout: 5000
primary_replica:
adapter: postgresql
encoding: unicode
database: sample
host: "10.0.0.1"
port: "5432"
username: "postgres"
password:
- default の設定があるのですが、取り敢えず全消し。
- あと、app/models/application_records.rb も変更:
class ApplicationRecord < ActiveRecord::Base
primary_abstract_class
self.abstract_class = true
connects_to database: { writing: :primary, reading: :primary_replica }
end
- rails console というのは強力なツール.. railsに慣れると離れられない理由なのか・・
dbconv(dev)* def copy_table(k)
dbconv(dev)* list = nil
dbconv(dev)* ActiveRecord::Base.connected_to(role: :reading) { list = k.all }
dbconv(dev)* ActiveRecord::Base.connected_to(role: :writing) { k.insert_all(list.map(&:attributes)) }
dbconv(dev)> end
dbconv(dev) copy_table(Sample)
(行が流れて)
05, 20.8, 383.14, 22.9, 20.19, 10.25, 195.08, 0.0, 0.0, 2.083, 0.1041, 14.8, 263.42, 4.1, 46.25, 0.0, 0.0, 1.973, 0.99, 0.9865, 147.975, 13.5, 189.9, 14.1, 200.29, 9.15, 47.2, 0.0, 0.0, 17.05, 56.87, 0.0, 203.23, 19.25, 46.59, 14.3, 45.7, 16.0, 294.73, 8.21, 54.19, 0.75, 0.75, ' ', 0.0, 0.0, 4.3, 7.92, 0.75, 0.75, NULL, NULL), (2253, '2015-07-06 00:00:00', 10002, 10002, 1.0528, 1.0336, 1.1364, 1.0, 0.9569, 1.0127, 1.105, 20.7, 381.3, 22.8, 20.19, 10.4, 200.03, 0.0, 0.0, 1.961, 0.098, 14.7, 261.64, 3.9, 43.99, 0.0, 0.0, 1.943, 0.97, 0.9715, 145.725, 13.7, 192.71, 14.55, 206.68, 8.8, 45.4, 0.597, 90.27, 17.0, 56.7, 0.0, 202.35, 19.3, 46.71, 14.35, 45.86, 15.85, 291.96, 7.99, 52.73, 1.2, 1.2, ' ', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NULL, NULL), (2255, '2015-07-07 00:00:00', 10002, 10002, 1.0363, 1.0336, 1.1364, 1.0, 0.9569, 1.0127, 1.105, 21.0, 386.83, 23.2, 21.15, 10.65, 205.85, 0.0, 0.0, 1.843, 0.0921, 14.75, 262.529232, 3.9, 43.99, 0.0, 0.0, 1.956, 0.98, 0.978, 146.7, 13.35, 187.79, 14.4, 204.55, 8.55, 44.11, 0.0, 0.0, 17.05, 56.87, 0.0, 200.69, 20.2, 48.89, 14.2, 45.38, 16.2, 298.41, 8.01, 52.87, 0.95, 0.95, ' ', 0.0, 0.0, 3.8, 7.0, 0.85, 0.85, NULL, NULL), (2256, '2015-07-08 00:00:00', 10002, 10002, 1.0363, 1.0336, 1.1364, 1.0, 0.9569, 1.0127, 1.105, 21.05, 387.75, 23.4, 22.59, 11.15, 215.19, 0.0, 0.0, 2.181, 0.109, 14.65, 260.75, 4.15, 46.81, 0.0, 0.0, 1.959, 0.98, 0.9795, 146.925, 13.6, 191.303448, 14.3, 203.13, 8.95, 45.45, 0.0, 0.0, 17.4, 58.03, 0.0, 206.99, 19.8, 47.92, 13.9, 44.42, 16.4, 302.09, 7.68, 50.69, 0.8, 0.8, ' ', 0.0, 0.0, 3.85, 7.09, 0.95, 0.95, NULL, NULL), (2285, '2025-02-03 00:00:00', 10002, 10002, 1.0444, 1.0309, 1.1236, 1.0, 0.9662, 1.0127, 1.0959, 20.85, 380.9, 24.5, 34.8, 10.1, 188.91, 0.0, 0.0, 2.26, 0.11, 14.1, 250.3, 2.8, 31.58, NULL, NULL, 1.87, 0.94, 0.94, 140.47, 13.5, 191.74, 16.1, 226.12, 8.8, 45.03, 0.0, 0.0, 18.55, 61.17, NULL, 217.03, 21.3, 51.55, 14.65, 47.31, 16.2, 295.95, 8.25, 54.45, 1.0, 1.0, NULL, 0.0, 0.0, 4.7, 8.58, 1.05, 1.05, 0.0, 0.0) ON CONFLICT DO NOTHING RETURNING "id" /*application='Dbconv'*/
=>
#<ActiveRecord::Result:0x00007b6b93c0fec0
@column_indexes=nil,
@column_types={},
@columns=["id"],
@hash_rows=nil,
@rows=
[[1553],
[1632],
[1677],
[2257],
[1554],
[1633],
[2258],
[1555],
[1634],
[2259],
[1556],
[1635],
[1557],
[1636],
[2261],
[2284],
dbconv(dev)>
-
まだまだ細かい文法理解は出来てないが、習うより慣れろというところ。 年寄りの悪いところで理屈が先立つのだがより「そういう風に書く」というのも、ある意味で生成AIがやっている手法「コーパスをとにかく詰め込んでつなげていく」を繰り返すことしか無い。
-
rails の model を scaffold しないと console で "copy_table(" と打ったところで、モデルが無いので思ったようにサジェストされない。逆に scaffold をしてしまえば出て、tabで選べるともういたれりつくせりとなるので、こういうところでハマると「愛いやつじゃ、離れがたし」。
-
即席の copy_table 関数が走って、コピーができるのだが、実は"seq" がの定義が残っていてササッていた。
-
rake db:migration した際に posgresql 環境あるあるだが シーケンス型を使って採番しているテーブルがあると、triggerで next_val() が動いて 連番が取られるのだが、sqlite3にはその機能はないので、これらに関する記述はすべて消去しておかないとならない。
-
この手のSQLディアレクト問題はプロプライエタリなDB製品を選ぶと永遠について回る。
-
移行先のアプリでは、posgresqlにまかせて 自動採番の機能をサボっているので、実装をたさねばなるまい
strnh@pc:~/workdir/r-r/dummy/dbconv$ sqlite3 storage/development.sqlite3
SQLite version 3.45.1 2024-01-30 16:01:20
Enter ".help" for usage hints.
sqlite> select * from sampledata where id>2280;
2284|2016-01-13 00:00:00|10002|10002|1.0444|1.0309|1.1236|1.0|0.9662|1.0127|1.0959|20.85|380.9|24.5|34.8|10.1|188.91|0.0|0.0|2.259|0.11295|14.1|250.3|2.8|31.58|0.0|0.0|1.873|0.94|0.9365|140.475|13.5|191.74|16.1|226.12|8.8|45.034528|0.0|0.0|18.55|61.17|0.0|217.03|21.3|51.55|14.65|47.31|16.2|295.95|8.25|54.45|1.0|1.0| |0.0|0.0|4.7|8.58|1.05|1.05||
2285|2025-02-03 00:00:00|10002|10002|1.0444|1.0309|1.1236|1.0|0.9662|1.0127|1.0959|20.85|380.9|24.5|34.8|10.1|188.91|0.0|0.0|2.26|0.11|14.1|250.3|2.8|31.58|||1.87|0.94|0.94|140.47|13.5|191.74|16.1|226.12|8.8|45.03|0.0|0.0|18.55|61.17||217.03|21.3|51.55|14.65|47.31|16.2|295.95|8.25|54.45|1.0|1.0||0.0|0.0|4.7|8.58|1.05|1.05|0.0|0.0
sqlite>
- このデータを使うアプリ(expressjsで書いた)のを、railsで全部作り直すのもありか・・・ 続くかも。
Discussion