Mam bazę danych MySQL 5.7 z kilkoma tabelami przechowującymi identyfikatory UUID w kolumnach z typem danych VARCHAR. Próbuję przekonwertować naszą podstawę kodu, aby użyć wersji Slick 3.1.1, ale mam problem z UUID do konwersji String. To jest moja definicja kolumna:Jak używać UUID w kolumnie VARCHAR ze Slick?
def myCol: Rep[UUID] = column[UUID]("myCol", SqlType("VARCHAR"))
Kiedy biegnę zapytania otrzymuję wyjątki takie jak ten:
Got the exception java.sql.SQLException: Incorrect string value: '\xDA\xFD\xDAuOL...' for column 'myCol' at row 1
Z tego co rozumiem, Slick zakłada, że UUID powinien być przechowywany jako typy kolumn binarny tak próbowałem niejawnie przekonwertować na ciąg przy użyciu:
implicit val uuidToString = MappedColumnType.base[UUID, String](_.toString, UUID.fromString)
def myCol: Rep[UUID] = column[UUID]("myCol", SqlType("VARCHAR"))(uuidToString)
działa to do wkładania, ale kiedy wybrać wartości z myCol
wyniki pochodzą pusty. Ktoś wie, jak zmusić Slicka do użycia VARCHAR zamiast BINARY (16) do konwersji danych?
EDIT:
Z niejawna to zapytanie nie zwróciło żadnych wyników:
db.run { table.filter(_.myCol === val)).result }
Ale to się robi:
db.run { table.result }.map(_.filter(_.myCol == val))
EDIT2:
Mam mały projekt z demonstracją tutaj: https://github.com/nmatpt/slick-uuid-test
Po prostu notatkę, ale można również przechowywać bity wysokiej/niskiej kolejności, ponieważ UUID to tylko dwie wartości "długie" (i powiązanie dwóch kolumn jako pojedynczego klucza unikalnego). Jeśli nadal chcesz używać łańcuchów, nie potrzebujesz 'VARCHAR' (jako ciąg UUID jest zawsze 36 znaków, 32 z usuniętymi myślnikami). – Rogue