データベースの次は自動徘徊
PythonでとうとうWebからデータを引っこ抜いて(言い方悪いかな?)
データベースに突っ込むことができた。
これで必要なデータをWebからとってきて
いつでも自分のDBで見ることができる。
ここまでで、一区切り。
次は・・
Webからデータ引き抜くことができたら、
今度はWebの自動巡回だ
そうすれば定期的にデータを取得することができる。
会社でseleniumを使ったのだけど、
テストのために使っただけで、
本格的に使ったことがない。
これができれば、
Webを自動で見ることができる
さて、次の目標が決まった。
目標立てないと、
人って動かないんだよなぁ。
068/100
#100DaysOfCode
継続は力なり
数日間、手が止まったり、
壁にぶち当たって進まなかったりしたけれど、
それでもうまくできないことが気になったり
色々参考サイトを見たりして
色々いじってたら、突然できた
なんでもそうかも知れないけど
問題に当たったら、
ちょっと間を置いたり、時間をかけて調べたり、
どこかで気にしていれば、
問題の解決の糸口や解決方法が見つかるのかな
前回、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
ちょっと無謀でも、やってみる
この記事がとてもよくて
一旦CSVにデータを出力さえすれば、DBに取り込める。
でも、CSVにデータを出力しなくてもDBに取り込めるのではないかと思い、
with open('csv/data.csv', newline='') as csvfile:
read = csv.reader(csvfile)
for row in read:
sql = "INSERT INTO KIONDATA VALUES('{}',{})"
sql = sql.format(str(row[0]).replace("/","-"),row[1])
cur.execute(sql)
connection.commit()
この部分のVALUESの中の配列と同じように取得したデータを入れればいいんじゃないかと思い、色々弄った
でも、結果はうまく動かない
なので、
まずは、CSVファイルに吐き出してから、このサンプル通りに取り込むことにする。
色々やってみて、壁にぶち当たって、いっぱい遠回りしてたどりつければいいかな。
その間のことも決して無駄じゃないから。
066/100
#100DaysOfCode
きっちり理解
pythonからpostgresqlを利用するには、psycopg2というライブラリを使えばいい
import psycopg2
このライブラリを使うとselect文がそのまま書ける
あと、大事なのはcommitは別なこと
closeしただけでは、反映されない
commit前にselectしてデータを見るとちゃんと反映されているように見えるのが、
間違いの元だ
executeすると自動的にcommitするようにするには
conn.autocommit = True
とすればいい。
hassiweb-programming.blogspot.com
あとは、postgresの権限の問題に悩まされた
一番わかりやすかったのが、これ
postgresのユーザでログインして、そこからロール(ユーザ)を作って、そのロールにログインできる権限つけて、最後にアクセスしたいテーブルに許可しないとだめ。
上の3つをやるとはじめてテーブルが参照できた。
そこまでわかるのに1週間ぐらいかかってる。
これだから、データベース恐怖症になるのだな。
でも、これだけわかればあとはSQL文を学ぶだけ。
少し進んだかな。
3連休、楽しんだ。
065/100
#100DaysOfCode
少しずつやっていく
なんとか起動したpostgres
pgAdmin4というwebブラウザから見えるツールでコマンドラインでテーブルを作成して実際にどこにできるかを見てみた
まずはコマンドラインでログインから
sudo -i -u postgres
で、ログインしているユーザーのパスワードを聞かれるから入力すると
o protocol specified
Can't open display :0
No protocol specified
Can't open display :0
No protocol specified
Can't open display :0
postgres@xxxxxx-ub19:~$
となる。
これ正しいのかな?それでも気にせず次へ。
create database sample;
で、sampleデータベースができる
これはどこにできたかというと・・posgresのアカウントでsampleデータベースが作成できた。
データベースsampleへのアクセスは
psql sample;
とやればいい。
これでsampleデータベースにアクセスした。
ここからテーブルを作成するには、
create table seiseki(math int,eng int,lang int);
とやればseisekiテーブルができた。
データ入力は、
insert into seiseki(math,eng,lang) values(100,95,89);
でオッケー。
データベースへのアクセスがログインの後、
psql <データベース名>
でいいことがわかった。
少しずつ理解して進んでいく。
これが大事。
064/100
#100DaysOfCode
やっているうちになぜかできる
posgresのブログを読みまくる
できたと思って早速pythonから繋げられるかと思ってやってみる
色々やってみたけれど、
roleがユーザだと思ったらユーザじゃなくて、
頭が混乱した
pgadmin4をインストールして、データ接続できるかどうか見てみたらなぜかできない。
postgresで接続してみたけれどどうもつながらない
で、色々見てみたら、こういう記事があった
これでもやってみた
hogeユーザを作って、pgadmin4で接続するとできた
何が悪かったのだろう?
決定打はこれかな
postgres=# CREATE USER hoge WITH PASSWORD 'pass';
新しいユーザを作ってパスワード決めて接続するとできるのかな
今あるユーザーだとだめなのかな
よくわからない
でもサービスも再起動してみた
service postgresql restart
これが効いたのかな
pgadmin4でツリーが出てきたのには感激した
再びこれ
そして、再びこれ
>>> import psycopg2
>>> connection = psycopg2.connect("host=192.168.24.97 port=9403 dbname=sampledb user=sayamada password=pssword")
>>> connection.get_backend_pid()
23769
これができて
>>> cur.execute("select version()")
>>> for row in cur:
... print(row)
...
('PostgreSQL 9.4.3 on i686-pc-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 32-bit',)
と出てきたのには感激した
ようやくつながったよ
これで少しだけ前へすすめるかな
063/100
#100DaysOfCode
mysqlがだめならpostgresqlで。
mysqlはどうにもこうにもエラーが取れない
なので、今度はpostgresqlで
会社でもpostgresqlを使っているので
それに多分GUIのツールも揃っているので・・
インストールに戸惑った
試してみないとわからない
上の方法だとubuntu 19ではだめだった
なので、元のwikiに従った
このコマンドライン通りにやって、途中、
deb http://apt.postgresql.org/pub/repos/apt buster-pgdg main
は通らなかったけれど、インストールできた
ま、よしとしよう
ここから進めてみる
062/100
#100DaysOfCode