Adtabázis kezelése GO programozási nyelvben

Az SQL paraméterezése adatbázistól függően eltérő.
A MySQL-ben például így kell megadni a paramétereket, ahol a sorrend szerint történik a paraméterek behelyettesítés:


  db.Query("SELECT * FROM table WHERE price+vat>? and country=?", 130.5, "USA")

Postgre-ben viszont így:


  db.Query("SELECT * FROM table WHERE price+vat>$1 and country=$2", 130.5, "USA")

Oracle-ben pedig így:


  db.Query("SELECT * FROM table WHERE price+vat>:VAL and country=:COUNTRY", 130.5, "USA")

A paraméterek egységes használatát a mydb modulban oldottam meg, az Oracle mintáját követve, ahol teljesen mindegy a paraméterek sorrendje, mert a paraméterek nevük szerint vannak azonosítva. Ehhez elegendő megadni ParamReplacingMode konstans értékét, ami 0,1,2 értékeket vehet fel.

Ezzel elértem, hogy függetlenül az adatbázistól az SQL paraméterezését mindenhol egyformán lehet megadni. Ennek használata a következő:


  mydb.ParamReplacingMode = 0  //0=Oracle, 1=MySQL, 2=Prostgre
  isql:=mydb.InitSql(db, "SELECT * FROM table WHERE price+vat>:VAL and country=:COUNTRY") 
  mydb.Params(isql, ":COUNTRY", "USA", ":VAL", 130.5)
  res, err:= mydb.SqlQuery(isql)   
  if err != nil {
	fmt.Println("Error:" + fmt.Sprint(err) + mydb.SqlStr(isql))
  }

Ugyanez használható "Insert", "Update", "Delete" SQL parancsok esetében is, csak SqlQuery() helyett SqlExec() metódust kell meghívni.


  isql:=mydb.InitSql(db, "INSERT INTO table (id, name) VALUES (:ID, :Name)" )
  mydb.Params(isql, ":ID", 1, ":Name", nil)     //NULL
  res, err:= mydb.SqlExec(isql)
  if err != nil {
	fmt.Println("Error:" + fmt.Sprint(err) + mydb.SqlStr(isql))
  }

Az SQL lekérdezés adatainak tárolása

Szinte mindendenhol az SQL lekérdezés adatait egy speciális, az adott lekérdezésnek megfelelő struktúrába tárolják. Jól látható ez itt: https://go.dev/doc/tutorial/database-access a "Query for multiple rows" címszó alatt. Ez viszont azt jelenti, hogy minden egyes SQL lekérdezéshez létre kell hozni egy speciális objektumot (struktúrát).
Ezt mindenáron el akartam kerülni, mivel azt akartam elérni, hogy bármilyen SQL lekérdezés adatait mindíg ugyanolyan módon tudjam felhasználni, és ne kelljen minden SQL lekérdezéshez létre hozni egy speciális struktúrát. Erre szintén a "mydb" modulban egy InterSql interface hoztam létre, ami bármilyen SQL lekérdezés adatival tud dolgozni, pl. JSON tud generálni stb.
Ennek használata nagyon egyszerű, amit a következő példa mutat be.

Az első példa, az adatok sorról sorra történő felhasználását mutatja be.


var (
	mTSQL mydb.RecSql
	mSQL  mydb.InterSql
)
mSQL = &mTSQL

db := mydb.MyConnect()  // or mydb.OraConnect()
res, err := db.Query("select * from g40_config where order by c_IMEI")
if err == nil {
	mSQL.Init(res, "")
	for mSQL.GetNext() {
	   mIMEI:=mSQL.ValStr("c_IMEI")   
	   ...
	}
}

Ebben a második példában az egész adathalmazt beolvassuk az mSQL objektumba és utánna csinálunk valamit.

 
res, err := db.Query("select * from g40_config where order by c_IMEI")
if err == nil {
	mSQL.Init(res, "")
	for mSQL.GetNext() {}  // read all rows to mSQL

	mIMEI:=mSQL.ValStr("c_IMEI",0)   // rows[0]  
	....
}