sequelize-auto を PostgreSQL に対して実行したら TypeError: connection.query(...).on is not a function と怒られるとき

sequelize-auto とは

sequelize-auto とは、既存のデータベースのスキーマを読み取ってファイルに吐き出してくれる CLI アプリケーションです。Ruby ならば Ridgepole が近いでしょうか。

PostgreSQL に対して実行するとエラーが出ることがある

PostgreSQL に対して sequelize-auto を実行すると以下のようなエラーが出ることがあります。

$ sequelize-auto -o "./models" -d my_database -h localhost -u my_username -p 5432 -x my_password -e postgres
TypeError: connection.query(...).on is not a function

どうするか

pg のバージョンを 6.4.2 に下げます。

$ yarn add pg@6.4.2
(省略)
✨  Done in 2.16s.
$ sequelize-auto -o "./models" -d my_database -h localhost -u my_username -p 5432 -x my_password -e postgres
(省略)
ers' AND c.table_schema = 'public'
Done!

参考

CircleCI 上での System Spec (RSpec) が unknown error: DevToolsActivePort file doesn't exist と怒られて失敗する場合

結論

Headless Chrome の設定の箇所において、optionsno-sandbox を指定しましょう。例えば以下のようになります。

  config.before(:each) do |example|
    driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400], options: { args: ['no-sandbox'] } if example.metadata[:type] == :system
  end

補足

RSpec とか CircleCI とかに関わらない一般的な内容かと思います。

Capybara + Headless Chrome (System Spec) で Basic認証 を通過する方法

結論

  • usernamepassword のところは実際には環境変数を使ったほうがいいでしょう
  • visit_with_http_auth root_path における root_path はアクセスしたいページの path を入れましょう
require 'rails_helper'

def visit_with_http_auth(path)
  username = 'MY_USERNAME'
  password = 'MY_PASSWORD'
  visit "http://#{username}:#{password}@#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}#{path}"
end

RSpec.feature 'ベーシック認証', type: :system do
  scenario '登録されているIDとパスで通過できること' do
    visit_with_http_auth root_path
    expect(page).to have_content '表示されててほしい文字列'
  end
end

参考

RSpec で Headless Chrome を使う際に Chrome が Dev だったり Canary だったりする場合(安定版とは異なるバージョンの Chrome を使っている場合)の対処法

大原則

使用する Chrome に合った ChromeDriver を ダウンロード します。

合致するバージョンがない場合に以下を試します

結論

エラーが出たときに出てくるエラーメッセージをよく読みます。

          Webdrivers::VersionError:
            Unable to find latest point release version for 77.0.3854. You appear to be using a non-production version of Chrome. Please set `Webdrivers::Chromedriver.required_version = <desired driver version>` to a known chromedriver version: https://chromedriver.storage.googleapis.com/index.html

つまりどうするか

spec/rails_helper.rb に以下のように書きます。76.0.3809.68 の箇所の数値は、落としてきた ChromeDriver のバージョン番号を入れます。

RSpec.configure do |config|
  (省略)
  Webdrivers::Chromedriver.required_version = '76.0.3809.68'
  (省略)
end

spec/rails_helper.rb はチーム共通のファイルであってそれを修正できない場合には spec/support 配下に適当に同等の記述をしたファイルを置き、.git/info/exclude で自分のみの除外指定をすると良いです。

参考

補足

場合によっては以下のエラーが出ることがありました。

NameError:
  uninitialized constant Webdriver
Powered by はてなブログ