2012-11-14 25 views
11

Tôi đang sử dụng slick trong dự án scala để truy vấn một số bảng.Vấn đề phát sinh khi đi với PostgreSQL

//define table 
object Addresses extends Table[Address]("assetxs.address") { 
    def id = column[Int]("id", O.PrimaryKey) 
    def street = column[String]("street") 
    def number = column[String]("number") 
    def zipcode = column[String]("zipcode") 
    def country = column[String]("country") 
    def * = id ~ street ~ number ~ zipcode ~ country <> (Address, Address.unapply _) 
} 

Nếu tôi sử dụng bất kỳ truy vấn của bảng này nó không hoạt động (nó nói nó không thể tìm bàn của tôi) vì vậy tôi đã đi xa hơn và in ra các truy vấn như:

implicit val session = Database.forURL("jdbc:postgresql://localhost:5432/postgres", driver = "org.postgresql.Driver", user="postgres", password="postgres").createSession() 
     session.withTransaction{ 
     val query = Query(Addresses) 
     println("Addresses: " + query.selectStatement) 
} 

tôi nhận thấy rằng tên của schema.table xuất hiện trong "" nên tuyên bố là:

select x2."id", x2."street", x2."number", x2."zipcode", x2."country" 
from "assetxs.address" x2 

trong đó tất nhiên không làm việc (tôi đã cố gắng để chạy nó trong công cụ PostgreSQL và tôi cần phải loại bỏ "" từ tên bảng để làm việc đó.

Bạn có thể vui lòng cho tôi biết nếu có bất kỳ tùy chọn nào để không bao gồm "" trong bất kỳ truy vấn nào khi sử dụng tên bảng?

+1

Bạn chắc chắn rằng đây là vấn đề bạn đang gặp phải? Số nhận dạng không được kiểm định được chuyển đổi thành trường hợp thấp hơn trong PostgreSQL, trong ví dụ của bạn, loại bỏ các dấu ngoặc kép sẽ dẫn đến một truy vấn giống hệt nhau. –

+0

@AntsAasma, tôi chắc chắn rằng "assetxs.address" là phần mềm gây ra đau đầu. –

+0

http://stackoverflow.com/questions/6720626/how-do-i-specify-a-postgresql-schema-in-scalaquery –

Trả lời

6

Cuối cùng Tôi đã có thể giải quyết vấn đề này.

tôi chỉ định tên bảng chỉ:

object Addresses extends Table[Address]("address")

và thay đổi conf postgresql tôi để bao gồm sơ đồ của tôi khi tìm kiếm (có vẻ như mượt mà đang tìm kiếm về chỉ public schema):

search_path = '"$user",assetxs,public'

và giờ nó hoạt động.

+0

Rất vui khi thấy bạn tìm thấy giải pháp thay thế và cảm ơn bạn đã chia sẻ :-) Bạn đã thử cách này chưa: jdbc: postgresql: // localhost: 5432/yourdatabase? searchpath = assetxs – Jack

+0

@JacobusR vâng, nhưng tôi không hiểu tại sao nó không hoạt động ... –

4

Bạn đã đặt lược đồ vào tên bảng. Một tên bảng (được trích dẫn) có chứa một ký tự dấu chấm là hợp lệ trong SQL nhưng nó không phải là những gì bạn muốn ở đây. Bạn cần phải xác định các lược đồ riêng:

object Addresses extends Table[Address](Some("assetxs"), "address") 
+1

Cảm ơn nhưng dường như theo cách này lược đồ không còn được bao gồm trong câu lệnh sql: 'Câu lệnh SQL: chọn x2." id ", x2." street ", x2." number " , x2 "zipcode", x2 "đếm ry" từ "address" x2' –

+0

@CristianBoariu Nếu tôi không nhầm, bạn có thể chỉ định lược đồ như một phần của URL cơ sở dữ liệu, nhưng tôi không thể kiểm tra đúng hiện nay. – Jack

+0

@JacobusR Tôi đã thử rằng quá giống 'url? Schema = assetx' nhưng vẫn không hoạt động ... –

-2

Bạn chỉ cần sử dụng trình điều khiển sai, kiểm tra hàng nhập khẩu của bạn

nhập khẩu scala.slick.driver.PostgresDriver.simple._

+0

Tôi đã sử dụng nhập khẩu mà bạn chỉ định: 'import scala.slick.driver.PostgresDriver.simple._' –

3

Giải pháp tôi tìm thấy khi muốn làm việc với cả H2 (thử nghiệm) và Postgres (sản xuất) sử dụng liquibase và slick.

  • Stick với chữ thường trong Bảng Slick của bạn đối tượng

class MyTable(tag: Tag) extends Table[MyRecord](tag, Some("my_schema"), "my_table")

  • Trong H2 url cấu hình của bạn, bạn sẽ cần phải xác định DATABASE_TO_UPPER = false (điều này ngăn cản bảng và cột tên từ là thượng cased) và đặt dấu ngoặc kép xung quanh lược đồ INIT (điều này ngăn cản lược đồ từ trên cao hơn)

url = jdbc:h2:mem:test;MODE=PostgreSQL;DATABASE_TO_UPPER=false;INIT=create schema if not exists \"my_schema\"\;SET SCHEMA \"my_schema\""

  • Khi chỉ định tên lược đồ trong tập lệnh mã hóa lỏng, nó cũng phải được trích dẫn để H2 không cố viết hoa.
2

Kể từ khi vấn đề này vẫn còn làm phiền những người mới Scala (như tôi), tôi đã thực hiện nghiên cứu nhỏ và thấy rằng như vậy một application.conf đã thành công với Slick 3.1.1 và PostgreSQL 9.5:

postgres.devenv = { 
    url = "jdbc:postgresql://localhost:5432/dbname?currentSchema=customSchema" 
    user = "user" 
    password = "password" 
    driver = org.postgresql.Driver 
} 
Các vấn đề liên quan