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

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

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

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

1022閲覧

Django クエリのシングルクォーテーションについて

xx_6_6_xx

総合スコア42

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2019/10/25 01:54

したいこと

modelに直接クエリを記載しているのですが、
betweenの日付のシングルクォーテーションがうまくいきません。。

発生している問題

シングルクォーテーションをクエリ内につけると、
シングルクォーテーションが「2つ」ついているSQLが発行され、

じゃあ、変数で代入される日付に最初からシングルクォーテーションがついてるのかな?
と思って、
シングルクォーテーションをクエリ内につけないと
シングルクォーテーションがないSQLが発行されます。。。

(変な日本語ですみません、、、)

該当のソースコード

Django

1# Create your models here. 2class UserData(models.Model): 3 ユーザーコード = models.CharField(max_length=10,primary_key=True) 4 氏名 = models.CharField(max_length=20,null=True) 5 役職コード = models.CharField(max_length=6,null=True) 6 役職名 = models.CharField(max_length=30,null=True) 7 更新日時 = models.DateTimeField(blank=True,null=True) 8 9 class Meta: 10 managed = False 11 default_permissions = [] 12 db_table = 'UserData' 13 14 def get_data(self, sdate, edate, name, code): 15 return UserData.objects.raw( 16 " SELECT * FROM UserData " 17 + " WHERE (更新日時 BETWEEN %s AND %s ) "###ここが問題点です 18 + " and 氏名 LIKE '%%%s%%' " 19 + " and ユーザーコード LIKE '%%%s%%' " 20 + " ORDER BY 更新日時 DESC" 21 ,[sdate,edate,name,code])

postgreSQL

1#コンソールで確認したSQL 2 3##Web画面から入力したパラメータ ⇒{'sdate': '2019-10-01', 'edate': '2019-10-20', 'name': '', 'code': ''} 4##sdate.edateの中身 ⇒ 2019-10-18 00:00:00 2019-10-20 23:59:59 5 6<RawQuerySet: SELECT * FROM UserData 7 WHERE (更新日時 BETWEEN 2019-10-01 00:00:00 AND 2019-10-20 23:59:59 ) 8and 氏名 LIKE '%%' 9and ユーザーコード LIKE '%%' 10ORDER BY 更新日時 DESC>

↑このままだと、betweenのsdateとedateにシングルクォーテーションがついてないので
エラーにはなりませんが、データ抽出ができません。。。

試したこと

%sを '%s'にする
⇒''2019-10-01 00:00:00''になり、シングルクォーテーションがダブるのでエラー

%sを "%s"にする
⇒"'2019-10-01 00:00:00'"になりエラー

%sを "%s"にする(バックスラッシュ)
⇒''2019-10-01 00:00:00''になりエラー

%sを %s\にする(バックスラッシュ)
⇒ '2019-10-01 00:00:00'\になりえエラー

%sを ''%s''にする
⇒''2019-10-01 00:00:00''になりエラー

お願いします

今までストアドしか使っていなかったので、
どなたかこういう直SQLについてわかる方。。。
教えてください。。。。

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

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

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

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

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

guest

回答2

0

viewの方で、変数に直接

sdate = param['sdate'] + ' 00:00:00' sdate = "\'" + sdate + "\'" edate = param['edate'] + ' 23:59:59' edate = "\'" + edate + "\'"

として、使うことにしました。。。!

投稿2019/10/25 07:13

xx_6_6_xx

総合スコア42

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

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

Orlofsky

2019/10/25 07:18

お力になれず、すみません。
xx_6_6_xx

2019/10/25 07:21

とんでもないです!! 沢山回答頂いてとても勉強になりました。。。。! また沢山質問すると思うので、その時もぜひご協力宜しくお願いします!
guest

0

ベストアンサー

TO_TIMESTAMP を使っては?

投稿2019/10/25 03:01

Orlofsky

総合スコア16415

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

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

xx_6_6_xx

2019/10/25 05:19

こういうのがあるんですね・・・! ご回答ありがとうございます! 試してみました、、! SELECT * FROM UserData WHERE (更新日時 BETWEEN to_timestamp(%s, 'YYYY/MM/DD HH24:MI:SS') AND to_timestamp(%s, 'YYYY/MM/DD HH24:MI:SS') ) and 氏名 LIKE '%%%s%%' and ユーザーコード LIKE ' '%%%s%%' ORDER BY 更新日時 DESC ; としてみました。。。が、 発行されたクエリは SELECT * FROM UserData WHERE (更新日時 BETWEEN to_timestamp(2019-10-01 00:00:00, 'YYYY/MM/DD HH24:MI:SS') AND to_timestamp(2019-10-20 23:59:59, 'YYYY/MM/DD HH24:MI:SS') ) and 氏名 LIKE '%%' and ユーザーコード LIKE '%%' ORDER BY 更新日時 DESC で、やっぱりシングルクォーテーションがついてないので データ抽出できませんでした。。。 使い方が間違っているのでしょうか?;; 引き続きご回答頂けるとありがたいです、、、
Orlofsky

2019/10/25 05:24

to_timestamp(2019-10-01 00:00:00, 'YYYY/MM/DD HH24:MI:SS') ↓ to_timestamp('2019-10-01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') と日時の部分もシングルクォーティングしてください。
xx_6_6_xx

2019/10/25 05:35

SELECT * FROM UserData WHERE (更新日時 BETWEEN to_timestamp('%s', 'YYYY/MM/DD HH24:MI:SS') AND to_timestamp('%s', 'YYYY/MM/DD HH24:MI:SS') ) and 氏名 LIKE '%%%s%%' and ユーザーコード LIKE ' '%%%s%%' ORDER BY 更新日時 DESC ; にしました! 発行されたクエリは SELECT * FROM UserData WHERE (更新日時 BETWEEN to_timestamp(''2019-10-01 00:00:00'', 'YYYY/MM/DD HH24:MI:SS') AND to_timestamp(''2019-10-20 23:59:59'', 'YYYY/MM/DD HH24:MI:SS') ) and 氏名 LIKE '%%' and ユーザーコード LIKE '%%' ORDER BY 更新日時 DESC という風に、シングルクォーテーションが2つ ついてしまいます、、 pgAdminなどで直接 SELECT * FROM UserData WHERE (更新日時 BETWEEN to_timestamp('2019-10-01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') AND to_timestamp('2019-10-20 23:59:59', 'YYYY/MM/DD HH24:MI:SS') ) and 氏名 LIKE '%%' and ユーザーコード LIKE '%%' ORDER BY 更新日時 DESC と入力すれば、結果を得られるのですが、、 models.pyに書く時はどうすればよいのでしょうか。。。
Orlofsky

2019/10/25 06:16

Django の部分は解らないので、あてずっぽうですが、 %s の前後のシングルクォート を2つか3にしてみては? to_timestamp('%s', 'YYYY/MM/DD HH24:MI:SS') ↓ to_timestamp('''%s''', 'YYYY/MM/DD HH24:MI:SS')
xx_6_6_xx

2019/10/25 06:29

ありがとうございます。。。 だめでした。。。 3つつけると、4つになって発行され、 2つつけると、3つになって発行されます。。 1つつけると、2つになり、 つけないと、0(クォーテーションがない状態)になります。。。
Orlofsky

2019/10/25 06:52

張り込む日時データをシングルクォートで囲むことはできますか? %s の前に % を続けてみるとか? それでもダメならお手上げです。
xx_6_6_xx

2019/10/25 07:11

ありがとうございます! 一応自己解決することが出来ました!! 恐らくその方法になったと思います・・・!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問