ニックジャガー日記

勝手気ままだけど自分に素直なブログ

継続は力なり

数日間、手が止まったり、

壁にぶち当たって進まなかったりしたけれど、

それでもうまくできないことが気になったり

色々参考サイトを見たりして

色々いじってたら、突然できた

 

なんでもそうかも知れないけど

問題に当たったら、

ちょっと間を置いたり、時間をかけて調べたり、

どこかで気にしていれば、

問題の解決の糸口や解決方法が見つかるのかな

 

前回、CSVで吐き出したのを、

読み込もうとしていたけれど、

同じように質問している人がいて、

それを参考にしたら、できた

 

こういう時、日本語よりも英語のサイトの方が

参考になるのはなぜだろう?

それだけやっている人口も世界の方が圧倒的に多いからかな

 

オレがわからなかったのは、

プレースホルダー」

 

とってきたデータをどうやって「SQL文に埋め込む」かがわからなかった

調べてわかったのは、とてもシンプルでそのまま書けばいいってこと

 

埋め込むのにいつもエラーが出てたのは、以下のエラー

TypeError: argument 1 must be a string or unicode object

 

まずは、参考になったサイト

stackoverflow.com

 

ここでプレースホルダーの書き方が書いてある

そして日本語のサイトも

qiita.com

 

SQL文のプレースホルダーは%sですべていいと。数値であってもそれは%sで設定すればあとはpostgresqlでやってくれると書いてある。上の例はmysqlだけど。これでやってみようと思った。

 

最初のリンクですごいなと思ったのは、

query = "UPDATE posts SET translated_text='%s', detected_language='%s' WHERE post_id=%s;"
vars = translation, detected_language['language'], str(post_id) # tuple
cur.execute(query, vars)

 

これで動くと書いてある。

cur.execute(query,vars)

これがわかるまでとても時間がかかった

この方法が取れるなら、SQL文を定義して、そこにプレースホルダーを%sで入れて、varsでそこに当たるデータを入れればいい。これはとてもわかりやすい。

 

これで実行したら・・・動いた。

動いた瞬間、感動した。

 

知っている人からみたら当たり前と思うかも知れないけれど、

自分ができなかったことができるようになったのは、

大変な喜びだった。

 

諦めずにどこかで考えて続けていく。

これが大事。

 

継続は力なり。

 

これに尽きる。

 

---

追記:

これ、psycopgライブラリの仕様だったんだ。

もともとのサイトを見直した。

www.psycopg.org

 

ここに、色々注意点が書いてあって、オレもやって混乱したことが、書いてあった。

Warning

 

Never, neverNEVER use Python string concatenation (+) or string parameters interpolation (%) to pass variables to a SQL query string. Not even at gunpoint.

どうしても文字列を操作してやろうとして「+」を使って最初コケて、%でコケました。

 

やっぱり仕様書を最初から調べてればすぐに解けたのに。元をたどるのが一番なんだな。そして、今回書いたコードもそのまま書いてあった。

>>> SQL = "INSERT INTO authors (name) VALUES (%s);" # Note: no quotes
>>> data = ("O'Reilly", )
>>> cur.execute(SQL, data) # Note: no % operator

このままやん!笑 

コーテーションマークはつけないのが、原則。(%sであって、'%s'ではない)

 

全部書いてある。ハマったところが、全部。笑

 

067/100

#100DaysOfCode