Cześć!
Zawitałem na Wasze forum jako pytający ponieważ zadałem już kilka podobnych pytań na stackoverflow i nikt nie potrafi mi tam pomóc.
Problem jest dość skomplikowany. Mam do napisania aplikację webową (spring | mysql | thymyleaf) która będzie działała trochę jak MySQL Workbench online.
Chodzi o to że każdy użytkownik strony będzie mógł utworzyć na niej bazę danych, jedną, drugą, trzecią, ile będzie chciał. A następnie będzie mógł wykonywać podstawowe operacje na tych bazach. Czyli CRUD po prostu.
Wymyśliłem sobie to w ten sposób:
- Kiedy użytkownik wciśnie dajmy na to przycisk, "utwórz bazę danych", to zostanie utworzony plik.sql z unikalną nazwą, do tego pliku.sql zostanie zapisany odpowiedni kod sql który jest odpowiedzialny za utworzenie tej bazy. Czyli np. ktoś klika utwórz bazę danych, wpisuje nazwe "mojabaza", wtedy ja tworzę plik mojabaza.sql, otwieram go i zapisuję do niego:
Create schema mojabaza;
- Kolejny przykład, użytkownik chce utworzyć tabelę o nazwie "mojatabela" z polami x,y,z. Wtedy ja z powrotem otwieram ten jego plik mojabaza.sql i wpisuję tam kod sql odpowiedzialny za utworzenie tej tabeli.
- Koniec tej historii jest taki że mam plik.sql w którym jest cała baza użytkownika gotowa do tego aby wkleić ją do jakiegoś interpretera sql i wykonać. W mojej bazie głównej będę trzymał tylko i wyłącznie ścieżki do tych plików.
**No i tutaj zaczynają się schody... ** Ponieważ tak jak wykonanie po stronie kodu CRUD'a jest bezproblemowe, to jak mam wykonać taki kod jak "Create schema / czy Create table?
Podszedłem do tego w ten sposób że skoro w moim pliku konfiguracyjnym application.properties jestem połączony z moją bazą no to nie jest to dziwne że nie moge wykonać polecenia "create schema". Więc zmieniłem mój plik konfiguracjny.
Poprzednio tak wyglądało moje połączenie z bazą:
spring.datasource.url=jdbc:mysql://localhost:3306/mojabaza
spring.datasource.username=root
spring.datasource.password=student
a teraz wygląda tak:
spring.datasource.url=jdbc:mysql://localhost:3306/
spring.datasource.username=root
spring.datasource.password=student
Usunąłem nazwę bazy i teraz na moją logikę jestem połączony po prostu z samym serwerem SQL. Sprawdzałem na testowym projekcie i kiedy tak zrobię to wszystkie polecenia SQL działają, create schema również.
Niestety problemy zaczynają się kiedy zrobię coś takiego w moim głównym projekcie -.= Ponieważ tam używam Encji. Wydawało mi się że jedyne co będę musiał zmienić no to zapytania.
Zamiast pisać takie selecty:
SELECT * FROM tabela
To wystarczy przerobić to na coś takiego:
SELECT * FROM mojabaza.tabela
W moich encjach dodałem w adnotacji @Table parametr schema = "mojabaza"
@Entity
@Table(name = "role", schema = "mojabaza")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "role_id")
private int id;
@Column(name = "role_name")
private String role;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}
Tak czy inaczej mam masę błędów podczas próby wykonania tych encji przez kompilator. "No database selected", takiego typu błędy dostaję. Myślałem że będę mógł korzystać po prostu ze wszystkich baz które mam w workbenchu wystarczy że usunę nazwę bazy w połączeniu z bazą no i sprecyzuję wszędzie w kodzie z której bazy należy korzystać.
**
Sam już nie wiem czy to dobry sposób na rozwiązanie tego problemu... Raczej nie wiem nawet czy to jest wykonalne w ten sposób. Czy ktoś miałby dla mnie jakieś porady jak sobie z tym poradzić? Może powinienem inaczej podejść do tematu? Nie mam innego pomysłu jak wykonać cały ten kod sql... Jest to mój pierwszy projekt w springu.
**
To są linki do pytań które zadawałem na stackoverflow na ten sam temat:
https://stackoverflow.com/questions/59347501/how-to-create-mysql-database-from-java-code
https://stackoverflow.com/questions/59358493/how-to-use-multiple-databases-with-spring