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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2122閲覧

【python】空白の日付をMySQLにINSERTする方法

m.t.m

総合スコア14

MySQL

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/09/09 04:50

前提

作成したリストをMySQLに流し込むプログラムを作成中です。
リストの基にしているcsvの関係で日付に空白が入ります。

実現したいこと

空白、もしくはNULLを日付に挿入する。

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

MySQLdb.OperationalError: (1292, "Incorrect datetime value: '' for column 'date' at row 2")

該当のソースコード

python

1import MySQLdb 2 3#MySQLへ接続 4mydb = MySQLdb.connect( 5 user='user', 6 passwd='pass', 7 host='XX.XX.XXX.XX', 8 db='database' 9) 10 11#リスト 12list = [("2022/02/05","田中","合格","2022/03/15"), 13 ("","佐藤","未検収","2022/03/15"), 14 ("2022/02/11","林","","")] 15#クエリ 16query = "insert into `test_table`(`date`,`name`,`result`,`update`) values (%s,%s,%s,%s)" 17 18mycursor = mydb.cursor() 19mycursor.executemany(query, list) 20mydb.commit()

試したこと

調べるとNULLが入ると分かったので”NULL”を入れてみたのですが結果は同じでした。
>1292, "Incorrect datetime value: 'NULL' for column 'date' at row 2"

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

SQLのテーブルです。
よろしくお願いします。

mysql> show columns from test_table; +--------+--------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+--------------+------+-----+-------------------+----------------+ | date | date | YES | | NULL | | | name | varchar(20) | NO | PRI | NULL | | | result | varchar(10) | YES | | NULL | | | update | date | YES | | NULL | | +--------+--------------+------+-----+-------------------+----------------+

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

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

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

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

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

guest

回答1

0

ベストアンサー

「NULLという文字」と「NULL」は別物です。
Python詳しくないのですが、コードの印象とエラー内容から「NULLという文字」を入れようとしているように見受けられます。
実行されるSQLはこうなってるはず
('2022/02/11','林','','NULL')
ではなくこうなるように。
('2022/02/11','林','',NULL)

ここの文字列の組み立てを
%s,%s,%s,%s
「空文字ならnull(以下にようになるように直に書いてください)、そうでなければ%s」のように動的にする必要がありそうです。

%s,%s,%s,null

投稿2022/09/09 04:55

編集2022/09/09 04:57
m.ts10806

総合スコア80852

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

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

m.t.m

2022/09/09 05:16

回答ありがとうございます。 ご察しの通りプログラミング初心者です。 文字として判定されていたので、日付のカラムに入らなかったと理解しました。 リストの修正ばかりで、クエリ自体を修正しようとは思い至りませんでした。 リスト1行ずつ変換しながらクエリを毎回実行していく方法しか思いつかないですがやってみます
m.ts10806

2022/09/09 05:21

まず思いつく方法で良いかと。 件数が物凄く多いなら「バルクインサート」という手法を用いた方がexecuteは1回で済むのでパフォーマンス的には良いかもしれません。 ※VALUES以降をレコードの数だけ用意して「,」で繋ぐだけ。値のバインドは気を付けて。  ひとまず今やろうとしていることができたら調べてみてください。
m.t.m

2022/09/09 07:42 編集

replaceを使ってクエリ内の”NULL”をNULLに変換して動きました。 件数が増えると繰り返しも増えるので時間がかかりますが、嬉しく思います。 今後バルクインサートも調べてみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問