Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Używasz symbolu zastępczego ? w zapytaniu Go mySql dla czegokolwiek innego niż int

Nie możesz używać symboli zastępczych dla identyfikatorów (takich jak nazwy tabel i kolumn), symbole zastępcze dotyczą wartości . Możesz myśleć o identyfikatorach jako podobnych do nazw zmiennych lub funkcji w Go, więc możliwość używania symboli zastępczych dla identyfikatorów byłaby podobna do posiadania eval jak w różnych językach skryptowych.

To ogranicza cię do używania fmt.Sprintf i podobne operacje na ciągach do budowania SQL, gdy nie znasz identyfikatorów do czasu uruchomienia:

col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)

ale to otwiera cię na wstrzykiwanie SQL i problemy z cytowaniem, więc potrzebujesz jakiejś białej listy:

quotedColumns := map[string]string{
    "firstName": "`firstName`",
    "lastName": "`lastName`",
    ...
}

quoted, ok := quotedColumns[columnName]
if !ok {
    // Do something with the error here and run away...
}
sql := fmt.Sprintf("select %s from persons", quoted)

Zwróć uwagę, że w wartościach mapy umieściłem znak zapytania MySQL. W standardowym interfejsie nie ma nic do cytowania/opisywania identyfikatora, więc musisz to zrobić sam. Jeśli już piszesz ręcznie mapę białej listy, możesz równie dobrze dołączyć cytat ręcznie; w przeciwnym razie możesz napisać własną funkcję cytowania dla identyfikatorów, czytając dokumentację MySQL na temat cytowania i wykonując kilka (miejmy nadzieję) prostych operacji na ciągach znaków.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL CASE do aktualizacji wielu kolumn

  2. porównywanie dat według miesiąca i roku w mysql

  3. Powielanie tabeli, indeksów i danych MySQL

  4. PHP MySQL PDO:jak zachować wiodące zera w kolumnach typu zerofill int

  5. Microsoft SQL Server odpowiednik MySQL REGEXP