継続は力なり
数日間、手が止まったり、
壁にぶち当たって進まなかったりしたけれど、
それでもうまくできないことが気になったり
色々参考サイトを見たりして
色々いじってたら、突然できた
なんでもそうかも知れないけど
問題に当たったら、
ちょっと間を置いたり、時間をかけて調べたり、
どこかで気にしていれば、
問題の解決の糸口や解決方法が見つかるのかな
前回、CSVで吐き出したのを、
読み込もうとしていたけれど、
同じように質問している人がいて、
それを参考にしたら、できた
こういう時、日本語よりも英語のサイトの方が
参考になるのはなぜだろう?
それだけやっている人口も世界の方が圧倒的に多いからかな
オレがわからなかったのは、
「プレースホルダー」
とってきたデータをどうやって「SQL文に埋め込む」かがわからなかった
調べてわかったのは、とてもシンプルでそのまま書けばいいってこと
埋め込むのにいつもエラーが出てたのは、以下のエラー
TypeError: argument 1 must be a string or unicode object
まずは、参考になったサイト
ここでプレースホルダーの書き方が書いてある
そして日本語のサイトも
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ライブラリの仕様だったんだ。
もともとのサイトを見直した。
ここに、色々注意点が書いてあって、オレもやって混乱したことが、書いてあった。
Warning
Never, never, NEVER use Python string concatenation (
+
) or string parameters interpolation (%
) to pass variables to a SQL query string. Not even at gunpoint.
どうしても文字列を操作してやろうとして「+」を使って最初コケて、%でコケました。
やっぱり仕様書を最初から調べてればすぐに解けたのに。元をたどるのが一番なんだな。そして、今回書いたコードもそのまま書いてあった。
このままやん!笑
コーテーションマークはつけないのが、原則。(%sであって、'%s'ではない)
全部書いてある。ハマったところが、全部。笑
067/100
#100DaysOfCode