Command Line

For command management Jennifer uses Sam. So in your sam.cr just add loading migrations and Jennifer hooks.

require "./your_configuration_folder/*" # with requiring jennifer and her adapter
require "./migrations/*"
require "sam"
load_dependencies "jennifer"

# your custom tasks here

Sam.help

DB namespace

db:create

Creates database described in the configuration.

$ crystal sam.cr -- db:create

Will create only one database. This means that for test environment (and for any extra environment you want) this command should be invoked separately. This is common for all commands in this section.

If database is already exists - successfully finishes (returns code 0).

db:drop

Drops database described in the configuration.

$ crystal sam.cr -- db:drop

db:setup

Creates database, invokes all pending migrations and populate database with seeds.

$ crystal sam.cr -- db:setup

db:migrate

Runs all pending migrations and stores them in the versions table. After execution of new migrations database schema is dumped to the structure.sql file.

$ crystal sam.cr -- db:migrate

db:step

Runs exact count of migrations (1 by default).

$ crystal sam.cr -- db:step
$ crystal sam.cr -- db:step <count>

db:rollback

Rollbacks the last run migration

$ crystal sam.cr -- db:rollback

To rollbacks specific count of migrations:

$ crystal sam.cr -- db:rollback <count>

To rollback to the specific version:

$ crystal sam.cr -- db:rollback -v <migration_version>

db:version

Outputs current database version.

$ crystal sam.cr -- db:version

db:seed

Populates database with seeds. By default this task is empty and should be defined per project bases.

$ crystal sam.cr -- db:seed

db:schema:load

Creates database from the structure.sql file.

$ crystal sam.cr -- db:schema:load

Running migration after this may cause error messages because of missing any information about run migrations in scope of current schema generating.

Generating namespace

generate:model

Generates model and related migration based on the given definition.

$ crystal sam.cr -- generate:model <ModelName> [field1:type] ... [fieldN:type?]

Example:

$ crystal sam.cr -- generate:model Article title:string text:text? author:reference
# ./src/models/article.cr

class Article < Jennifer::Model::Base
  with_timestamps

  mapping(
    id: Primary64,
    title: String,
    text: String?,
    author_id: Int64?,
    created_at: Time?,
    updated_at: Time?,
  )

  belongs_to :author, Author
end

# ./db/migrations/<timestamp>_create_articles.cr

class CreateArticles < Jennifer::Migration::Base
  def up
    create_table :articles do |t|
      t.string :title, {:null => false}
      t.text :text

      t.reference :author

      t.timestamps
    end
  end

  def down
    drop_table :articles if table_exists? :articles
  end
end

Available types:

  • bool
  • bigint
  • integer
  • short
  • tinyint
  • float
  • double
  • string
  • text
  • timestamp
  • date_time
  • json
  • reference

The ? symbol at the end of type name means that this field is nilable.

generate:migration

Generates simple migration template.

$ crystal sam.cr -- generate:migration CreateArticles