尝试使用 Crystal 和 Jennifer 制作一个简单的 API,但在执行 crystal run 时不断出现 SQLite 错误

问题描述 投票:0回答:1

我一直在尝试制作一个简单的 Crystal API,但我不断得到

In lib/sqlite3/src/sqlite3/result_set.cr:1:1

1 | class SQLite3::ResultSet \< DB::ResultSet
^
Error: abstract `def DB::ResultSet#current_column_name()` must be implemented by SQLite3::ResultSet

我一直尝试安装不同的东西和版本来调整它,但没有成功

这是我的分片.yml



name: travel_api
version: 0.1.0

description: "API for travel."


dependencies:
  kemal:
    github: kemalcr/kemal
  jennifer:
    github: imdrasil/jennifer.cr
    version: "0.12.0"
  sqlite3:
    github: crystal-lang/crystal-sqlite3
  jennifer_sqlite3_adapter:
    github: imdrasil/jennifer_sqlite3_adapter

targets:
  travel-api:
    main: src/main.cr

license: MIT

我也有一个模型、一个控制器、一条路线和一个主干

型号

# model.cr
require "jennifer"

class TravelPlan < Jennifer::Model::Base
  mapping(
    id: {type: Int32, primary: true},
    travel_stops: Array(Int32),
    created_at: {type: Time, null: true},
    updated_at: {type: Time, null: true}
  )

  def initialize(@travel_stops : Array(Int32))
  end
end
# controller.cr
require "./model"

module TravelApiController
  extend self

  def create_travel_plan(ctx : HTTP::Server::Context)
    travel_stops = JSON.parse(ctx.request.body.to_s, to: Array(Int32))
    travel_plan = TravelPlan.new(travel_stops: travel_stops)
    
    handle_response(ctx, travel_plan.save) do
      ctx.response.status = 201
      ctx.response.write(travel_plan.to_json)
    end
  end

  def get_all_travel_plans(ctx : HTTP::Server::Context)
    travel_plans = TravelPlan.all
    handle_response(ctx, true) do
      ctx.response.write(travel_plans.to_json)
    end
  end

  def get_travel_plan(ctx : HTTP::Server::Context)
    id = ctx.params.url["id"].to_i
    travel_plan = TravelPlan.find(id)

    handle_not_found(ctx, travel_plan) do
      ctx.response.status = 200
      ctx.response.write(travel_plan.to_json)
    end
  end

  def update_travel_plan(ctx : HTTP::Server::Context)
    id = ctx.params.url["id"].to_i
    travel_stops = JSON.parse(ctx.request.body.to_s, to: Array(Int32))
    travel_plan = TravelPlan.find(id)

    handle_not_found(ctx, travel_plan) do
      travel_plan.travel_stops = travel_stops

      handle_response(ctx, travel_plan.save) do
        ctx.response.status = 200
        ctx.response.write(travel_plan.to_json)
      end
    end
  end

  def delete_travel_plan(ctx : HTTP::Server::Context)
    id = ctx.params.url["id"].to_i
    travel_plan = TravelPlan.find(id)

    handle_not_found(ctx, travel_plan) do
      travel_plan.delete
      ctx.response.status = 204
    end
  end

  private def handle_response(ctx : HTTP::Server::Context, success : Bool)
    if success
      yield
    else
      ctx.response.status = 500
      ctx.response.write("Erro ao salvar o plano de viagem.")
    end
  end

  private def handle_not_found(ctx : HTTP::Server::Context, entity)
    if entity
      yield
    else
      ctx.response.status = 404
      ctx.response.write("Plano de viagem não encontrado.")
    end
  end
end`
`# main.cr
require "kemal"
require "sqlite3"
require "./model"
require "./controller"

# Configurar conexão com o banco de dados
DB.open "sqlite3://./db/travel_api.db" do |db|
  # Configurar Jennifer para usar a conexão SQLite3
  Jennifer::DB.connection = db
end

# Configurar Kemal
Kemal.config do |config|
  config.host = "0.0.0.0"
  config.port = 3000
end

Kemal.run do
  # Configuração do Kemal

  post "/travel_plans", TravelApiController.create_travel_plan
  get "/travel_plans", TravelApiController.get_all_travel_plans
  get "/travel_plans/:id", TravelApiController.get_travel_plan
  put "/travel_plans/:id", TravelApiController.update_travel_plan
  delete "/travel_plans/:id", TravelApiController.delete_travel_plan
end

我尝试更改 sqlite 和 jennifer 的版本,并期望它应该可以工作,但我无法运行我的应用程序并出现此错误

sqlite rest controller crystal-lang jennifer
1个回答
0
投票

也许有帮助:

require "jennifer"
require "jennifer_sqlite3_adapter"

https://github.com/imdrasil/jennifer_sqlite3_adapter

© www.soinside.com 2019 - 2024. All rights reserved.