Go 如何解组数据库中的64条记录以创建插入
我正在处理的项目应该是读取一个文件,然后基于该文件生成插入。 现在,脚本可以正常工作(有点)。 我在为表创建结构时遇到了一个问题,特别是为float64字段创建结构时。 我编写的脚本说明了类型为string和int的字段。我能够插入到具有这些字段类型的表中,但是如果我的数据库中有一个字段是float,那么脚本不会插入任何数据。 下面是我的脚本当前如何设置以检查int和string的类型Go 如何解组数据库中的64条记录以创建插入,go,Go,我正在处理的项目应该是读取一个文件,然后基于该文件生成插入。 现在,脚本可以正常工作(有点)。 我在为表创建结构时遇到了一个问题,特别是为float64字段创建结构时。 我编写的脚本说明了类型为string和int的字段。我能够插入到具有这些字段类型的表中,但是如果我的数据库中有一个字段是float,那么脚本不会插入任何数据。 下面是我的脚本当前如何设置以检查int和string的类型 func UnmarshalCsvRecord(readerTest *csv.Reader, v inter
func UnmarshalCsvRecord(readerTest *csv.Reader, v interface{}) error {
recordtest, err := readerTest.Read()
if err != nil {
return err
}
s := reflect.ValueOf(v).Elem()
if s.NumField() != len(recordtest) {
return &CheckField{s.NumField(), len(recordtest)}
}
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
switch f.Type().String() {
case "string":
f.SetString(recordtest[i])
case "int":
ival, err := strconv.ParseInt(recordtest[i], 10, 0)
if err != nil {
return err
}
f.SetInt(ival)
default:
return &UnsupportedCheck{f.Type().String()}
}
}
return nil
}
type CheckField struct {
expected, found int
}
func (e *CheckField) Error() string {
return "CSV line fields mismatch. Expected " + strconv.Itoa(e.expected) + " found " + strconv.Itoa(e.found)
}
type UnsupportedCheck struct {
TypeCheck string
}
func (e *UnsupportedCheck) Error() string {
return "Unsupported type: " + e.TypeCheck
}
句柄浮动使用与整数相同的模式。替换为。替换为 额外修复:打开而不是字符串
func UnmarshalCsvRecord(readerTest *csv.Reader, v interface{}) error {
recordtest, err := readerTest.Read()
if err != nil {
return err
}
s := reflect.ValueOf(v).Elem()
if s.NumField() != len(recordtest) {
return &CheckField{s.NumField(), len(recordtest)}
}
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
switch f.Type().Kind() {
case reflect.String:
f.SetString(recordtest[i])
case reflect.Int:
ival, err := strconv.ParseInt(recordtest[i], 10, f.Type().Bits())
if err != nil {
return err
}
f.SetInt(ival)
case reflect.Float64:
fval, err := strconv.ParseFloat(recordtest[i], f.Type().Bits())
if err != nil {
return err
}
f.SetFloat(fval)
default:
return &UnsupportedCheck{f.Type().String()}
}
}
return nil
}
句柄浮动使用与整数相同的模式。替换为。替换为 额外修复:打开而不是字符串
func UnmarshalCsvRecord(readerTest *csv.Reader, v interface{}) error {
recordtest, err := readerTest.Read()
if err != nil {
return err
}
s := reflect.ValueOf(v).Elem()
if s.NumField() != len(recordtest) {
return &CheckField{s.NumField(), len(recordtest)}
}
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
switch f.Type().Kind() {
case reflect.String:
f.SetString(recordtest[i])
case reflect.Int:
ival, err := strconv.ParseInt(recordtest[i], 10, f.Type().Bits())
if err != nil {
return err
}
f.SetInt(ival)
case reflect.Float64:
fval, err := strconv.ParseFloat(recordtest[i], f.Type().Bits())
if err != nil {
return err
}
f.SetFloat(fval)
default:
return &UnsupportedCheck{f.Type().String()}
}
}
return nil
}
对实现的一个小建议:将切换条件更改为
f.Type().Kind()
,并在切换案例中使用常量。对实现的一个小建议:将切换条件更改为f.Type().Kind()
,并在切换案例中使用常量。
switch f.Type().Kind() {
...
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
...
case reflect.Float64, reflect.Float32:
...
}