gpt4 book ai didi

database - Scala, Play - 无法插入 Postgresql 数据库

转载 作者:行者123 更新时间:2023-11-29 14:09:43 25 4
gpt4 key购买 nike

我有一个简单的 scala 和 play 代码,用于将产品插入数据库。

我在 application.conf 中的数据库配置如下:

db.default.hikaricp.connectionTestQuery = "SELECT 1"

db.default.driver=org.postgresql.Driver
db.default.url="jdbc:postgresql://localhost:5432/shop"
db.default.user="postgres"
db.default.password="root"

表定义和 crud 操作:

case class Product(id: Long, name: String, description: String, price: BigDecimal, amount: Int)

case class ProductFormData(name: String, description: String, price: BigDecimal, amount: Int)

object ProductForm {

val form = Form(
mapping(
"name" -> nonEmptyText,
"description" -> nonEmptyText,
"price" -> bigDecimal,
"amount" -> number
)(ProductFormData.apply)(ProductFormData.unapply)
)
}

class ProductTableDef(tag: Tag) extends Table[Product](tag, "product") {

def id = column[Long]("id", O.PrimaryKey, O.AutoInc)

def name = column[String]("name")

def description = column[String]("description")

def price = column[BigDecimal]("price")

def amount = column[Int]("amount")

override def * =
(id, name, description, price, amount) <> (Product.tupled, Product.unapply)
}

object Products {

val products = TableQuery[ProductTableDef]

private def db: Database = Database.forDataSource(DB.getDataSource())

def add(product: Product): Future[Int] = {
try db.run(products += product)
finally db.close
}

def delete(id: Long): Future[Int] = {
db.run(products.filter(_.id === id).delete)
}

def get(id: Long): Future[Option[Product]] = {
db.run(products.filter(_.id === id).result.headOption)
}

def listAll: Future[Seq[Product]] = {
db.run(products.result)
}
}

服务:

object ProductService {
def addProduct(product: Product): Future[Int] = {
Products.add(product)
}
}

和 Controller :

def create() = Action(parse.json) { request =>
val name = (request.body \ "name").as[String]
val description = (request.body \ "description").as[String]
val price = (request.body \ "price").as[BigDecimal]
val amount = (request.body \ "amount").as[Int]

val product = Product(0, name, description, price, amount)
ProductService.addProduct(product)

Ok("name : " + product.name)
}

一切看起来都很好,过程中没有错误(我使用 postman ,创建 json 并将其发送到服务器)。但毕竟数据库中没有数据。甚至表都没有在数据库中创建。我真的不知道为什么不能将其添加到数据库中。

编辑:

create table "Product" ("id" BIGSERIAL NOT NULL PRIMARY KEY,"name" VARCHAR(254) NOT NULL,"description" VARCHAR(254) NOT NULL,"price" Decimal, "amount" BIGINT NOT NULL);

这是我用来手动创建表的脚本,然后我尝试将数据从请求中保存到数据库中。从请求中读取一切正常(创建对象产品)但没有数据仍然安全地进入数据库。

编辑 2:

case class Product(id: Option[Long], name: String, description: String, price: BigDecimal, amount: Int)

class ProductTableDef(tag: Tag) extends Table[Product](tag, "product") {

def id = column[Long]("id", O.PrimaryKey, O.AutoInc)

def name = column[String]("name")

def description = column[String]("description")

def price = column[BigDecimal]("price")

def amount = column[Int]("amount")

override def * =
(id.?, name, description, price, amount) <> (Product.tupled, Product.unapply)
}

我用 Option auto increment field 更新了 models 和 dao,但没有帮助。

最佳答案

默认情况下在 Controller 中异步 Play Action 。所以渲染在调用数据库完成之前完成。调用数据库是一个缓慢的操作,这被认为是副作用:网络 + IO 操作。检查这一点的简单方法是在渲染之前放置下一个代码:

 Thread.sleep(2000)

你实际上应该做的是:

def add = Action.async( parse.json(userReads) ) { request =>
val results = userRepo.insert( UserData( None, request.body.name, request.body.note ) )
results.map(_ => Ok("done") )

要创建所需的表,您应该使用类似的东西:

val setup = DBIO.seq(
// Create the tables, including primary and foreign keys
(suppliers.schema ++ coffees.schema).create,


//
)

val setupFuture = db.run(setup)

这是精巧的 api 文档:http://slick.lightbend.com/doc/3.0.0/gettingstarted.html#schema

不确定你会把这个逻辑放在你的 webApp 中

尝试查看 Slick 生成的 SQL:

相应地更新你的方法 def 添加(产品:产品): future [Int] = { val 操作 = 产品 += 产品

   val sql = action.result.statements.toString()

// this is SQL query which slick will try run against postGreed
// you should be able to run it manually from SQL console to see reason why this failing
println(sql)

db.run( action )

关于database - Scala, Play - 无法插入 Postgresql 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44216471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com