我一直在尝试制作一个简单的 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 的版本,并期望它应该可以工作,但我无法运行我的应用程序并出现此错误
也许有帮助:
require "jennifer"
require "jennifer_sqlite3_adapter"