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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

1668閲覧

replaceでクォーテーションを消したいです。

Taka2401

総合スコア8

MySQL

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/06/14 03:57

編集2022/06/14 06:37

前提・実現したいこと

以下の文字列(table)にあるクォーテーションを削除し、動的にSQLのテーブル名を渡したいです。
同じようなコードがいくつか存在するため、テーブル名だけ変えて共通化することが目的です。
MySQLバージョン : 5.7.37

python

1class Fruit22Manager(models.Manager): 2 table = 'fruit_22'.replace("'", "") 3             # fruit_22のクォーテーションを削除したい 4 5 def find_status(self): 6              import pdb; pdb.set_trace() 7 # 関数実行時、self.table には 'fruit_22' が入っています。 8 sqlresult = self.raw(''' 9 SELECT 10 f.id, f.price, f.status 11 FROM 12 %s AS f # fruit_22を渡したいです 13 WHERE 14 f.state = 1 15 ''',[self.table])

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

クォーテーションがreplaceで削除されず、構文エラーが起きます。

(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 ‘’fruit_22’ AS f\n line 4")

ターミナル

sqlresult = self.raw(''' SELECT f.id, f.price, f.status FROM 'fruit_22' AS f WHERE f.state = 1 ''',[self.table])

試したこと

①数字のみ引数で渡す
無事に実行できましたが、数字がないテーブルにも汎用的に共通化したいため保留。

python

1class Fruit22Manager(models.Manager): 2 year = 22 3 4 def find_status(self): 5 sqlresult = self.raw(''' 6 SELECT 7 f.id, f.price, f.status 8 FROM 9 'fruit_'%s AS f 10 WHERE 11 f.state = 1 12 ''',[self.year])

②stripなど他の削除方法で実行(全てクォーテーション削除されず)
参考記事:https://www.delftstack.com/ja/howto/python/python-remove-quotes-from-string/

③他のファイルでテスト
試しに別ファイルを作成してreplaceを実行。(別ファイルでは削除できました)
hoge.py

hoge = 'fruit_22'.replace(' ', '') print(hoge)

実行結果

# 別ファイルだとなぜか削除できる fruit_22

なぜclass Fruit22Manager(models.Manager):でtableを定義すると、
クォーテーションが削除されないか原因を特定できておりません。
解決の糸口になるヒントを頂けますと幸いです。

よろしくお願いいたします。

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

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

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

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

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

can110

2022/06/14 05:56

self.raw関数の第2引数でselfとtableの2つからなるリストを渡していますが、意図通りでしょうか? フォーマットでは%sは一つしかないように見えるので。
Taka2401

2022/06/14 06:02

失礼しました。 正しくは self.table になります。修正しておきました。
can110

2022/06/14 06:12

find_status関数の呼出時にself.tableに何が入っているかを print(self.table)実行などして提示ください。
Taka2401

2022/06/14 06:38

find_status関数の呼出時にself.tableには、'fruit_22' が入っています。 よろしくお願いします。
guest

回答1

0

いろいろ腑に落ちない点はありますが

find_status関数の呼出時にself.tableには、'fruit_22' が入っています。

つまりself.tableが「'fruit_22'」という文字列なのであれば
''', [self.table.replace("'", "")])
のようにして'を取り除いた文字列を渡せるはずです。

投稿2022/06/14 06:50

can110

総合スコア38266

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

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

Taka2401

2022/06/14 07:17 編集

ご回答ありがとうございます。 ご教示いただいた通り、''', [self.table.replace("'", "")])を実行してみましたが変わらずクォーテーションが削除できておりません。 まず、find_status関数の呼出時に 'fruit_22' が <class 'str'> になっていることを確認をしてから、 %sに[self.table.replace("'", "")]の引数を渡して実行しました。 他にクォーテーションが削除されない要因があるとすれば、どのあたりを探ったほうがよろしいでしょうか。
can110

2022/06/14 07:38

Djangoのような何らかのフレームワークを利用しているものと思いますが find_status関数からMySQLへの接続(SQLクエリー発行)までのコードの流れが分かるような より広範囲のコード、設定などの情報を提示すると回答得られやすくなるかもしれません。
can110

2022/06/14 07:51

なお、提示の現象は「削除できない」というよりは、クエリー発行までにテーブル名に「'」が「勝手についてしまう」現象だと思います。
Taka2401

2022/06/14 09:44

アドバイスいただきありがとうございます。 僭越ながら私の所感としましては、 class Fruit22Manager(models.Manager): table = 'fruit_22'.replace("'", "") を定義した時点で、tableにシングルクォーテーションが削除できていなかったので、 クエリー発行以前の問題だと捉えており、クエリー発行までに「'」が「勝手についてしまう」現象だとまだ考えられておりません。 その点について、まずは調べてみようと思います。
can110

2022/06/14 10:11

table = 'fruit_22'.replace("'", "")について2つの勘違いをしているようですので、その指摘だけ。 ひとつめ。 「'fruit_22'」は「fruit_22」という文字列を表しており、この文字列の中にはシングルクオーテーションは含まれません。 ふたつめ。 「table」はクラス変数であり、インスタンス変数「self.table」とは全くの別物です。
Taka2401

2022/06/14 10:32

ご指摘いただきありがとうございます。 仰っていただいた通り、勘違いをしておりました。こちらに関しましても勉強していきたいと思います。 何度もご協力いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問