Mysql: Tidak dapat memindai null menjadi *string

Dibuat pada 28 Feb 2013  ·  15Komentar  ·  Sumber: go-sql-driver/mysql

Saya dulu menggunakan kode dari Google Code. Setelah memperbarui ke kode terbaru di master, saya mendapatkan kesalahan berikut yang tidak saya dapatkan sebelumnya:

sql: Scan error on column index 7: unsupported driver -> Scan pair: <nil> -> *string

Saya akan menyelidiki lebih lanjut, tetapi mungkin sementara itu Anda sudah mengetahui sesuatu tentang ini?

wontfix

Komentar yang paling membantu

Karena halaman ini masih muncul cukup tinggi di hasil pencarian, dua sen saya:

Anda juga dapat menyelesaikannya di bagian di mana, imo, masalahnya sebenarnya terletak: Tingkat abstraksi basis data. Anda dapat mengatasi masalah ini dengan melakukan hal berikut:

  SELECT
    id,
    COALESCE(name, '') as name
  FROM users

Dengan cara ini, jika name berisi NULL, string kosong akan diganti saat memindai. Coalesce didukung secara luas.

Semua 15 komentar

Kode lama mengembalikan []byte kosong untuk nilai NULL yang membuat tidak mungkin untuk membedakan nilai NULL dari string kosong.
Lihat Edisi #20 untuk detailnya.

Kesalahan dikembalikan oleh paket database/sql karena tujuan ini:

* Be flexible with type conversions, but be paranoid about silent
  truncation or other loss of precision.

Anda harus menggunakan http://golang.org/pkg/database/sql/#NullString jika kolom dapat berisi nilai NULL

Terima kasih, itu masuk akal.

Saya hampir menginginkan cara untuk mengonfigurasi perpustakaan untuk memberi saya perilaku lama. Dalam beberapa hal, "nilai nol sebagai default" Go sangat masuk akal dan menghilangkan banyak kode boilerplate. Saya lebih suka meletakkannya di satu tempat, dapat dikonfigurasi, alih-alih menyebarkannya ke mana-mana dalam kode saya sehingga saya mungkin menemukan NULL. Menggunakan NullString, dll cukup buruk dari segi kode.

NULL hanyalah mimpi buruk dan saya ingin menyingkirkan NULL. Saya secara eksplisit mendefinisikan setiap kolom dalam tabel _my_ sebagai NOT NULL, tetapi kadang-kadang perintah seperti SHOW PROCESSLIST akan memiliki NULL di dalamnya, dan kode saya tidak peduli; Saya ingin string kosong sebagai gantinya. Saya hanya akan menggunakan NullString, dan mengabaikan properti .Valid dan hanya mendapatkan .Stringnya, yang akan kosong jika kolomnya NULL.

Mampu memberi tahu pengemudi untuk mengonversi NULL ke nilai nol untuk tipe (atau sebenarnya, saya kira apa yang sebenarnya dilakukan adalah melewatkan pemindaian kolom ke dalam variabel) akan mengurangi banyak kesulitan dan rawan kesalahan (dan tidak- bukti masa depan) bekerja untuk saya. Atau, jika saya tidak menginginkan semua kode boilerplate, saya dapat mengambil risiko bahwa kolom a) benar-benar tidak dapat dibatalkan b) akan tetap seperti itu selamanya.

Saya juga lebih suka paket database/sql untuk mengikuti kebijakan "nilai nol default" Go. Anda masih dapat membedakan dengan tipe Null* jika perlu, tetapi sayangnya keputusan desain dibuat dengan cara ini. Mungkin mereka mengubahnya di Go2 (+1 dari saya untuk itu).
Untuk saat ini saya tidak punya rencana untuk menambahkan opsi driver untuk itu. Dibandingkan dengan PostgreSQL, protokolnya sudah berantakan (sulit saya anggap lebih efisien). Saya tidak ingin lebih mencampuri urusan pengemudi.
Satu str = nullStr.Value lebih per string yang dipindai adalah kejahatan yang lebih rendah untuk saat ini.

Saya mencoba menambahkan opsi ke nol nilai NULL : https://github.com/Go-SQL-Driver/MySQL/tree/zeroNULL
Tapi itu tidak mungkin pada tingkat pengemudi. Jika Anda menyetel nilai nol ke []byte{} Anda dapat memindainya ke string dan []byte tetapi tidak ke tipe numerik. Jika Anda menyetelnya ke 0 , Anda dapat memindainya ke tipe numerik tetapi Anda mendapatkan "0" sebagai string / []byte .

Saya tidak begitu mengerti bagaimana sebenarnya pengemudi memindai, tetapi alih-alih
menyetel dest[i] ke sesuatu, bagaimana jika pengemudi melewatkan pengaturan
tujuan[i]?

dest pada dasarnya adalah potongan []interface{} . Nilai default interface{} adalah nil . Jadi lewati pengaturan dest[i] memiliki hasil yang sama dengan pengaturan dest[i]=nil

Saya memperbarui cabang. Anda dapat mencobanya sendiri jika Anda mau.

Itu terlihat sempurna untuk kebutuhan saya, dan saya akan mencobanya lain kali saya memperbarui kami
salinan pengemudi.

Solusi lain muncul di benak saya:
Cukup gunakan []byte alih-alih string. Mengonversi nil-[]byte menghasilkan string kosong:

string([]byte(""))  // => ""
string([]byte(nil)) // => ""

http://play.golang.org/p/nivY1yBK3x

Mungkin tetap buka ini, mungkin bagus untuk Contohnya

Solusi: https://github.com/guregu/null

Karena halaman ini masih muncul cukup tinggi di hasil pencarian, dua sen saya:

Anda juga dapat menyelesaikannya di bagian di mana, imo, masalahnya sebenarnya terletak: Tingkat abstraksi basis data. Anda dapat mengatasi masalah ini dengan melakukan hal berikut:

  SELECT
    id,
    COALESCE(name, '') as name
  FROM users

Dengan cara ini, jika name berisi NULL, string kosong akan diganti saat memindai. Coalesce didukung secara luas.

Saya tidak mengerti mengapa melempar pengecualian ketika string adalah nol

Contoh ini berfungsi untuk saya

Anda dapat memberikan penunjuk string untuk mengatasinya seperti ini:

var txt *string
checkErr(result.Scan(&txt))
// do something with type *string

itu bekerja dengan baik untuk saya.

Selain komentar bagus @Dynom , saya pikir masih layak disebutkan bahwa tipe sql.NullString berguna jika Anda ingin mengatasi masalah di tujuan Scan (yang saya lihat sebagai sisi Go dari tingkat abstraksi database).

Selain itu, ini mempertahankan kemampuan untuk membedakan antara nilai nil dan string kosong .

Dengan nullstring, dev diharuskan membuat map vo jika ingin menampilkan informasi seperti json misalnya. Tidak masalah di sini, adalah pendekatan yang baik dan benar tetapi tidak masuk akal untuk semua kasus maka dapat menjadi pekerjaan tambahan dengan batasan bahasa.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

zhaohui-kevin picture zhaohui-kevin  ·  5Komentar

victormongi picture victormongi  ·  4Komentar

AlekSi picture AlekSi  ·  3Komentar

xuewindy picture xuewindy  ·  3Komentar

pedromorgan picture pedromorgan  ·  6Komentar