質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

1342閲覧

【GO言語】SQL、update文がうまくできません。(JSON形式)

benkyo_golang

総合スコア5

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/07/19 07:34

編集2021/07/20 03:59

前提・実現したいこと

以下のSQL文をGO言語で実装がしたいです。
通常のupdate分は実装できるのですが、JSON形式の値が入るとうまく実行ができません。(コンパイルはできます)
直接下記のSQLを実行する分には、うまくDBに反映されるので、GOでの書き方が良くないんだと思うのですが、、、

まだ、GOのSQLでJSONをうまく使えておらず、手が止まってしまったので質問させていただきました。
よろしくお願い致します。

【SQL文】
UPDATE users SET lastname="sss", lastupdatedat = JSON_SET(lastupdatedat, '$.Nanos', 5, '$.Seconds', 5) WHERE id="811180"; 

発生している問題・エラーメッセージ

context.Background.WithCancel.WithValue(type peer.peerKey, val <not Stringer>).WithValue(type metadata.mdIncomingKey, val <not Stringer>).WithValue(type grpc.streamKey, val <not Stringer>)

panic: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where ID=?' at line 1

該当のソースコード

db, err := sql.Open("mysql", "root:taitaitai@/mysql")
fmt.Println(ctx)
if err != nil {
panic(err.Error())
}
defer db.Close()

upd, err := db.Prepare("update users set lastname=?, `lastupdatedat` = json_set(`lastupdatedat`, '$.Nanos', ?, '$.Seconds', ?), where ID=?") if err != nil { panic(err.Error()) } defer upd.Close() if _, err := upd.Exec(inLastName, lastUpdatedAt.Nanos, lastUpdatedAt.Seconds, inID); err != nil { panic(err.Error()) }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/19 08:42 編集

GO言語のことは知らないけど、文字列を扱う上で引用符のシングルとかダブルに意味がちゃんとあるんじゃないでしょうか。変数を展開したSQL文字列が意図したものになっているかデバッグしてみては。Golang の文字列内で変数を展開する方法(Go言語の interpolation 各種) - Qiita https://qiita.com/KEINOS/items/baef1be88f15515026ec
guest

回答2

0

自己解決

ご回答、ご質問いただいた方々
ありがとうございます。質問させていただいたあとにGO上のSQL分を見直してみたらそもそもの記述が誤っておりました。

upd, err := db.Prepare("update users set lastname=?, lastupdatedat = JSON_SET(lastupdatedat, '$.Nanos', ?, '$.Seconds', ?) where ID=?")

でうまく動きました。

変更点
lastupdatedat の`を追加した。 ← これは必要があるか分かりませんが、、
②where句の前に,があった、、、(凡ミスです)

投稿2021/07/20 04:03

benkyo_golang

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

プレースホルダーの書き方は下記ではなくて?

GO

1upd, err := db.Prepare("update users set lastname=$1, firstname=$2, email=$3, password=$4, lastupdatedat = json_set(lastupdatedat, '$.Nanos', $5, '$.Seconds', $6), where ID=$7") 2

参考

投稿2021/07/19 13:49

odataiki

総合スコア973

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問