SQLite3のUNIQUE constraint failed

RubyフレームワークのHanamiでRepositoryの挙動をminitestでテストしてもユニークじゃないよと怒られた。migrationファイル見たら、カラムがユニークだったため(unique: true)、それを削除してbundle exec hanami db prepareしたが、やはりユニークじゃないと怒られた。

エラーメッセージ

TnoteNoteRepository#test_0001_associations are successful:
Hanami::Model::UniqueConstraintViolationError: SQLite3::ConstraintException: UNIQUE constraint failed: tnote_streams.tnote_note_id
↑「tnote_note_id」というカラムがユニーク設定になっているのに、値が重複したレコードを追加してるよ、的な意図のメッセージ

原因

minitest実行はtest環境で実行されるが、db prepareでdevelopment環境しかDB更新していなかったため。test環境もdb prepare(コマンド:HANAMI_ENV=test bundle exec hanami db prepare)することで解決。

Written with StackEdit.

MacのPostgres.appはDB名をダブルクリックで対話モード開始

Postgres.appをインストールして起動したあと、DB名をダブルクリックすると対話モード($ psql postgresの実行)に入れる。

ドキュメント見ても載ってなくて最初わからなかった。

■備考
1.Rubyでの設定方法もあったが、特に何もしなくてもPostgres.app動いてる。
Configuring Ruby for Postgres.app
 2.ただし、bundle installすると「checking for pg_config… no」と怒られるので以下Qiitaの記事で書かれた対応が必要。Gemfileに書いて開発してるかと思うので、「Gemfileに書いている時には環境変数CONFIGURE_ARGSを設定する」と書かれてる対応を実施する。
Postgres.appを使ってPostgreSQLを使う場合に、gem ‘pg’を入れる方法

Rails5でSQLiteからPostgreSQLに変更した時のメモ

■PostgreSQL側でCREATEDB権限がない時のエラー
———————————————————————
$ rails db:setup
PG::InsufficientPrivilege: ERROR:  permission denied to create database
———————————————————————
config/database.ymlで設定書いたユーザーにCREATEDB権限があるかどうか、PostgreSQL側で確認する。

■CarrierWaveで複数画像を投稿するとエラー
1.SQLiteとPostgreSQL/MySQLで実装方法が異なる。PostgreSQLの実装にする。
(参考)CarrierWave –  Multiple file uploads
(参考)CarrierWave 複数の画像をコード三行で一つのカラムに保存する ※PostgreSQL/MySQLの実装方法でSQLiteではない

2.複数画像を投稿時に以下エラーが出る場合は構文を書き間違えている可能性あり。
———————————————————————
TypeError in UsersController#create

no implicit conversion of nil into String
———————————————————————
(参考)Stack Overflow – “no implicit conversion of nil into String” error for carrierwave multiple image upload
「mount_uploaders」ではなく「mount_uploader」と書く。

———————————————————————
# app/models/users.rb
class User < ApplicationRecord
  # 画像1つのみアップロードする場合。imageカラムに格納指定。
  mount_uploader :image, ImageUploader
  # 複数画像アップロードする場合。image_anotherカラムに格納指定。
  mount_uploaders :image_another, ImageUploader
end
———————————————————————

PostgreSQLコマンドメモ

■PostgreSQLの対話的ターミナルの入り方
————————————————————————-
$ psql postgres
postgres=#
————————————————————————-

■DB名を指定してフル権限を付与する – GRANT
DB名「db_development」にユーザー「user_development」をフル権限(ALL PRIVILEGES)で付与する。
————————————————————————-
postgres=# GRANT ALL PRIVILEGES ON DATABASE db_development TO user_development;
GRANT
postgres=# l
————————————————————————-
補足:最後に「;」をつける
補足:DB名を指定する場合は「ON DATABSE」をつける。これがないとテーブル名指定になる

■DB作成権限を付与する – ALTER ROLE
ユーザー「user_development」に「CREATEDB」権限を付与する。
————————————————————————-
postgres=# ALTER ROLE user_development WITH CREATEDB;
ALTER ROLE
postgres=# du
————————————————————————-
https://www.postgresql.jp/document/8.1/html/sql-alterrole.html

■RailsでPostgreSQL使う場合に最初にやること
PostgreSQLの管理系コマンドまとめ

■参考情報
PostgreSQL 9.1.5文書 – GRANT
PostgreSQL 8.1.9文書 – ALTER ROLE

MacでPostgreSQLをバックグラウンド起動

 バックグラウンド起動すると怒られる。(スーパーユーザーであることが前提)
——————————————————————————–
bash-3.2$ su [スーパーユーザー]
bash-3.2$ pg_ctl start -D /usr/local/var/postgres -l logfile
server starting
bash-3.2$ /bin/sh: logfile: Permission denied
——————————————————————————–

logをパス指定しろと書いてあったのを見たので指定するとディレクトリだからと怒られる。
——————————————————————————–
bash-3.2$ pg_ctl start -D /usr/local/var/postgres -l /usr/local/var/log/
server starting
bash-3.2$ /bin/sh: /usr/local/var/log/: Is a directory
——————————————————————————–

logファイルっぽいものを作成して再度起動したら動いた。
——————————————————————————–
bash-3.2$ touch /usr/local/var/log/postgres.log

bash-3.2$ pg_ctl start -D /usr/local/var/postgres -l /usr/local/var/log/postgres.log
server starting
——————————————————————————–
※これで合ってるのかわかりません

念のため、プロセスとログが吐かれているか確認。一応OKっぽい。
——————————————————————————–
bash-3.2$ ps
PID TTY           TIME CMD
54744 ttys004    0:00.08 bash
55132 ttys004    0:00.05 /usr/local/Cellar/postgresql/9.6.5/bin/postgres -D /usr/local/var/postgres

bash-3.2$ cat /usr/local/var/log/postgres.log
LOG:  database system was shut down at 2017-10-07 14:40:22 JST
LOG:  MultiXact member wraparound protections are now enabled
LOG:  autovacuum launcher started
LOG:  database system is ready to accept connections
——————————————————————————–

MySQLでクロス集計する方法

■クロス集計で行数をカウント
SELECT `list_id`, FIELD(`category_id`, 10), FIELD(`category_id`, 11)  FROM `bookmarks` GROUP BY `list_id`;

■カウントした行数に値を掛けてクロス集計結果
SELECT `list_id`, SUM(FIELD(`category_id`, 10) * `count`), SUM(FIELD(`category_id`, 11) * `count`) FROM `bookmarks` GROUP BY `list_id`;

■参考サイト

 MySQLでクロス集計 日々是好日/ウェブリブログ

SQLiteのCSVファイルインポート時の日本語文字化けメモ

Windows XPでAccessのログ10万件ぐらいだとクエリが遅いのでSQLiteで
代わりに使ってみようと思う。

SQLiteのGUIツールはかなり出ていて、日本語も問題なくCSVインポートができるツールは
TkSQLite

それ以外のGUIツールは日本語がうまく表示できなかった。

■SQLiteのGUIツール文字化けのまとめ
 色々と試したところ、下記のことが分かった。

 1.UTF-8ファイルをインポートしてもGUIツールで見ると日本語が表示されず文字化け
 2.GUIツールで日本語を直接入力すると日本語はちゃんと表示される
 3.GUIツールで日本語入力したデータをCSVエクスポートしてファイルを開くと
   文字化けしている。その時のエンコードはShift-JIS形式になっている。
   (SQLiteはUTF-8をサポート)
 4.CSVファイルを開く(正常)
   ↓
   GUIツールでインポート
   ↓
   GUIツールで表示(文字化け)
   ↓
   GUIツールでエクスポート
   ↓
   CSVファイルを開く(正常)

   (つまり、GUIツール上だけ文字化けしていて、中のデータは文字化けしていない)

■試したSQLite GUIツール
 ・SQLite Database Browser 1.3         ⇒ インポート機能あり(文字化けする)
 ・SQLite Control Center3 ver 1.02 (SQLiteCC) ⇒ インポート機能なし
 ・SQLiteSpy 1.7.9               ⇒ インポート機能なし
 ・SQLite Studio 1.0.0             ⇒ インポート機能なし

■SQLite GUIツール一覧
sqlite – Management Tools