Π Π°Π±ΠΎΡΠ° ΠΌΠ΅ΡΡΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠΊ 💼

💭ΠΠ΅ΡΡΠ°Π΅ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² Π‘Π±Π΅ΡΠ΅, Π½ΠΎ Π½Π΅ Ρ ΠΎΡΠ΅ΡΡ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡΡ Π΄Π΅ΡΡΡΡ ΠΊΡΡΠ³ΠΎΠ² HR-ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΠΉ? Π’Π΅ΠΏΠ΅ΡΡ ΡΡΠΎ ΠΏΡΠΎΡΠ΅, ΡΠ΅ΠΌ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ!
💡AI-ΠΈΠ½ΡΠ΅ΡΠ²ΡΡ Π·Π° 15 ΠΌΠΈΠ½ΡΡ β ΠΈ ΡΡ ΡΠΆΠ΅ Π½Π° ΡΠ°Π³ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΡΠ²ΠΎΠ΅ΠΉ Π½ΠΎΠ²ΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅.
ΠΠ°ΠΊ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΡΡΠ΅Ρ? 📌 ΠΠ°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠΉΡΡ 📌 ΠΡΠΎΠΉΠ΄ΠΈ AI-ΠΈΠ½ΡΠ΅ΡΠ²ΡΡ 📌 ΠΠΎΠ»ΡΡΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΠ²ΡΠ·Ρ ΡΡΠ°Π·Ρ ΠΆΠ΅!
HR Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΡΠ½ΡΡ Π²ΡΠ΅ΠΌΡ β ΡΠ΅ΠΊΡΡΡΠ΅ΡΡ ΡΠ²ΡΠΆΡΡΡΡ Ρ ΡΠΎΠ±ΠΎΠΉ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π²ΡΡ Π΄Π½Π΅ΠΉ! 🚀
Π Π΅ΠΊΠ»Π°ΠΌΠ°. ΠΠΠ Π‘ΠΠΠ ΠΠΠΠ, ΠΠΠ 7707083893. Erid 2VtzquscAwp
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ
Π Go Π²ΡΠ΅ ΡΡΡΡΠΎΠ΅Π½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π°ΡΠ΅: ΡΡΠΎ ΡΠ·ΡΠΊ ΡΡΡΠΎΠ³ΠΎΠΉ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π΄Π°Π½Π½ΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠΈΠΏΠ°ΠΌ, Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΏΡΠΈΠ½ΡΡΡΡ
Π΄Π°Π½Π½ΡΡ
. ΠΠ°ΠΏΡΠΎΡΡ ΡΠΈΠΏΠ° SELECT *
ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π²ΡΠ΅Π³Π΄Π°, Π° ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»Π΅ΠΉ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π΄Π΅ΡΡΡΠΈ, ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠ° ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² ΠΌΡΠΊΡ.
ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ· ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π°:
// Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠ°
results, err := db.Query("SELECT id, name FROM tags")
if err != nil {
panic(err.Error()) // ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΊΠΈ
}
for results.Next() {
var id int
var name string
// ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² Π½Π°ΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
err = results.Scan(&id, &name)
if err != nil {
panic(err.Error())
}
}
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Row.Scan
Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·Π²Π»Π΅ΡΡ ΠΈΠ· Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
Π΄Π²Π° ΠΏΠΎΠ»Ρ, Ρ.Π΅. Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠ±ΡΡΠ²ΠΈΡΡ Π²ΡΠ΅Π³ΠΎ Π΄Π²Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅. ΠΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·Π²Π»Π΅ΡΡ 10 ΠΏΠΎΠ»Π΅ΠΉ, Π½ΡΠΆΠ½ΠΎ ΡΠΆΠ΅ 10 ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
. Π Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»Π΅ΠΉ Π±ΠΎΠ»Π΅Π΅ 20? ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ ΠΈ Ρ ΠΏΠΎΠ»ΡΡΠΎΡΠ½Π΅ΠΉ ΠΏΠΎΠ»Π΅ΠΉ, ΡΠΎΠ³Π΄Π° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² Π°Π΄β¦ Π ΡΡΡ Π½Π°ΠΌ Π½Π° ΠΏΠΎΠΌΠΎΡΡ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΈΡ.
ΠΠ°ΠΊ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΌΠ°ΡΠΈΠ½Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΠΉΡΡ ΠΊΠΎΠ΄?
Π MySQL Π΅ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ DESCRIBE, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΡΡΡΠΊΡΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ:
- ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° ΠΏΠΎΠ»Π΅ΠΉ;
- ΡΠΏΠΈΡΠΊΠΈ ΠΏΠΎΠ»Π΅ΠΉ Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² SELECT, INSERT ΠΈΠ»ΠΈ UPDATE;
- ΡΠΏΠΈΡΠΎΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Scan;
- Π³ΠΎΡΠΎΠ²ΡΠ΅ ΡΠΈΠΏΠΎΠ²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠΊΠΈ/Π²ΡΡΠ°Π²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ
.
ΠΠ°Π½Π½ΡΠ΅ ΠΈΠ· Π·Π°ΠΏΡΠΎΡΠ° DESCRIBE <ΠΈΠΌΡ ΡΠ°Π±Π»ΠΈΡΡ>
Π·Π°Π½ΠΎΡΠΈΠΌ Π² ΡΡΡΡΠΊΡΡΡΡ:
type Field struct {
name string // ΠΈΠΌΡ ΠΏΠΎΠ»Ρ
ftype string // ΡΠΈΠΏ ΠΏΠΎΠ»Ρ
sqltype string // ΡΠΈΠΏ SQL ΠΏΠΎΠ»Ρ
fn_conv string // ΠΈΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ
}
ΠΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π΄Π²Π° ΠΏΠΎΠ»Ρ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΡΡΡΡ ΠΏΠΎΠΏΠΎΠ·ΠΆΠ΅. ΠΠ· ΡΡΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠΎΠ»Π΅ΠΉ Π±Π΅Π·ΠΎ Π²ΡΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ AST (abstract syntax structure):
ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π²Π·ΡΡΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΠΎΡΠ·ΡΠ²ΠΎΠ² review
ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΡΡΠΊΡΡΡΠΎΠΉ:
CREATE TABLE `review` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`model` varchar(30) DEFAULT NULL,
`url` varchar(126) DEFAULT NULL,
`rate` int(11) DEFAULT NULL,
`positive` varchar(510) DEFAULT NULL,
`negative` varchar(510) DEFAULT NULL,
`review` text,
`created` int(10) unsigned DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
);
ΠΠΎΠ³Π΄Π° ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ DESCRIBE review
, ΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| model | varchar(30) | YES | | NULL | |
| url | varchar(126) | YES | | NULL | |
| rate | int(11) | YES | | NULL | |
| positive | varchar(510) | YES | | NULL | |
| negative | varchar(510) | YES | | NULL | |
| review | text | YES | | NULL | |
| created | int(10) unsigned | YES | | NULL | |
| title | varchar(255) | YES | | NULL | |
+----------+------------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)
ΠΠΎΠΏΡΡΠ°Π΅ΠΌΡΡ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΡΡΠΎΡ Π΄Π°ΡΠ°ΡΠ΅Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΌ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ΠΎΠΌ:
var fieldName string
var fieldType string
var fieldIsNull string
var fieldDefault string
var fieldComment string
var isKey string
sql_1 := "DESCRIBE " + tabName
rows, err := dg.Db.Query(sql_1)
errorCheck(err)
defer rows.Close()
for rows.Next() {
err = rows.Scan(&fieldName, &fieldType, &fieldIsNull, &isKey, &fieldDefault, &fieldComment)
ΠΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΎΡΠΈΠ±ΠΊΡ:
panic: sql: Scan error on column index 4, name "Default": converting NULL to string is unsupported
ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Ρ NULL
Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ²Π½ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΎ Π² ΡΠΈΠΏ string
.
ΠΠ°ΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ NULL?
Π§ΡΠΎΠ±Ρ ΡΠ°ΠΊΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠΈΠΏΡ:
sql.NullString
sql.NullFloat64
sql.NullInt32 ΠΈΠ»ΠΈ sql.NullInt64
sql.NullBool
sql.NullTime
ΠΡΠ΅ ΠΎΠ½ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΡ ΡΡΡΡΠΊΡΡΡΡ (Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ sql.NullString
):
type NullString struct {
String string // Π΄Π°Π½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ, Π΅ΡΠ»ΠΈ Π½Π΅ NULL, ΠΈΠ½Π°ΡΠ΅ ΠΏΡΡΡΠΎ
Valid bool // Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ true Π΅ΡΠ»ΠΈ String ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ NULL
}
ΠΡΠ»ΠΈ ΠΏΠΎΠ»Π΅ Valid
ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ true
, ΡΠΎ Π² ΠΏΠΎΠ»Π΅ String
Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΈΠ½Π°ΡΠ΅ NULL
. ΠΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΡ Π½ΠΈΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ:
func sql2String(str sql.NullString) string {
if str.Valid {
return str.String
}
return ""
}
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. ΠΡΠ»ΠΈ Π²Π΅ΡΠ½ΡΡΡΡΡ ΠΊ ΡΡΡΡΠΊΡΡΡΠ΅ Π½Π°ΡΠ΅ΠΉ ΡΠ°Π±Π»ΠΈΡΡ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠΌΡΡ ΡΠΈΠΏ:
var fieldIsNull sql.NullString
var fieldDefault sql.NullString
Π£ΠΏΡΠΎΡΠ΅Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Π°Π½Π°Π»ΠΈΠ·Π° ΡΠ°Π±Π»ΠΈΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ Π½ΠΈΠΆΠ΅:
for rows.Next() {
err = rows.Scan(&fieldName, &fieldType, &fieldIsNull, &isKey, &fieldDefault, &fieldComment)
errorCheck(err)
type_out := "string"
sql_type := "sql.NullString"
fn_conv := "sql2String"
if strings.Index(fieldType, "int") >= 0 {
type_out = "int64"
sql_type = "sql.NullInt64"
fn_conv = "sql2Int"
} else if strings.Index(fieldType, "char") >= 0 {
type_out = "string"
sql_type = "sql.NullString"
fn_conv = "sql2String"
} else if strings.Index(fieldType, "date") >= 0 {
type_out = "string"
sql_type = "sql.NullString"
fn_conv = "sql2String"
} else if strings.Index(fieldType, "double") >= 0 {
type_out = "float"
sql_type = "sql.NullFloat64"
fn_conv = "sql2Float"
} else if strings.Index(fieldType, "text") >= 0 {
type_out = "string"
sql_type = "sql.NullString"
fn_conv = "sql2String"
}
fields = append(fields, Field{fieldName, type_out, sql_type, fn_conv} )
}
DateTime
ΠΈΠ»ΠΈ Date
ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²ΡΠ²Π°Π»ΠΈΡΡ Π² ΡΡΡΠΎΠΊΡ. ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠΈΠΏ Π½Π° sql.Time
.ΠΠ°Π»Π΅Π΅ β Π΄Π΅Π»ΠΎ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ.
ΠΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΈΡ β ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ
ΠΠ· ΡΡΠ΅Π·Π° ΠΏΠΎΠ»Π΅ΠΉ fields
ΠΌΠΎΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠ΄. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π²Π·ΡΡ ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ (ΡΡΡΡΠΊΡΡΡΠ° ΡΠΎΠΆΠ΅ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π° ΡΡΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ):
func (dg *DbGen) generate() {
var fieldList []string
fmt.Printf("\tfunc get%s(db *sql.DB, %s %s) %s {\n", strings.Title(strings.ToLower(dg.tablename)),
dg.pk, dg.type_pk, strings.Title(strings.ToLower(dg.tablename )))
fmt.Println("\t\tvar(")
fmt.Printf("\t\t\tret %s\n", strings.Title(strings.ToLower(dg.tablename )))
for _,field := range dg.fields {
if field.name == dg.pk {
continue
}
fieldList = append(fieldList, field.name)
fmt.Printf("\t\t\t%s %s\n", field.name, field.sqltype)
}
fmt.Println("\t\t)")
out_fieldList := strings.Join(fieldList, ",")
out_vars := strings.Join(fieldList, ", &")
sql_txt := fmt.Sprintf( "SELECT %s FROM %s WHERE %s=?", out_fieldList, dg.tablename, dg.pk)
fmt.Printf("\t\tsql_s := \" %s \"\n" , sql_txt)
fmt.Printf("\t\trows, err := db.Query(sql_s, %s)\n ", dg.pk)
fmt.Println("\t\terrorCheck(err)")
fmt.Println("\t\tdefer rows.Close()")
fmt.Println("\t\tfor rows.Next() {")
fmt.Printf("\t\t\terr = rows.Scan(&%s)\n", out_vars)
fmt.Println("\t\t\terrorCheck(err)")
for _,field := range dg.fields {
if field.name == dg.pk {
fmt.Printf("\t\t\tret.%s=%s\n", field.name, field.name)
} else {
fmt.Printf("\t\t\tret.%s=%s(%s)\n", field.name, field.fn_conv, field.name)
}
}
fmt.Println("\t\t}")
fmt.Println("\t\treturn ret")
fmt.Println("\t}")
}
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Ρ
ΡΠ΅ΡΡΠΎΠΌΠ°ΡΠΈΠΉΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ errorCheck(err)
:
func errorCheck(err) {
if err != nil {
panic(err.Error())
}
}
Π’Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ NULL
:
- sql2String
- sql2Int
- sql2Float
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΠΎ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠΌΡ ΠΊΠ»ΡΡΡ, Π½ΠΎ ΡΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π΄Π»Ρ Π²ΡΡΠ°Π²ΠΊΠΈ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ ON DUPLICATE KEY UPDATE
. ΠΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΡΠΎΡΡΠ°Π²Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ β Π²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π²Π°ΡΠ΅ΠΉ ΡΠ°Π½ΡΠ°Π·ΠΈΠΈ. ΠΡΠ΅Π³Π΄Π° Π΅ΡΡΡ ΠΊΡΠ΄Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΡΡΡ: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈΠΊΡΡΡΠΈΡΡ ΠΊ ΠΊΠΎΠ΄Ρ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ, ΡΡΠΎΠ± ΠΏΡΠΎΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½Ρ ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠ°Π΄Π΅ΡΡΡ, ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π» ΠΌΠΎΠ΅ΠΉ ΡΡΠ°ΡΡΠΈ ΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π² Π½Π΅ΠΉ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΊΠΎΠΌΡ-ΡΠΎ ΡΠΎΠΊΡΠ°ΡΠΈΡ Π²ΡΠ΅ΠΌΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ. Π£Π΄Π°ΡΠΈ!
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ