ニックジャガー日記

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

データベースの次は自動徘徊

PythonでとうとうWebからデータを引っこ抜いて(言い方悪いかな?)

データベースに突っ込むことができた。

 

これで必要なデータをWebからとってきて

いつでも自分のDBで見ることができる。

 

ここまでで、一区切り。

 

次は・・

 

Webからデータ引き抜くことができたら、

今度はWebの自動巡回だ

そうすれば定期的にデータを取得することができる。

 

会社でseleniumを使ったのだけど、

テストのために使っただけで、

本格的に使ったことがない。

 

これができれば、

Webを自動で見ることができる

 

さて、次の目標が決まった。

 

目標立てないと、

人って動かないんだよなぁ。

 

 

068/100

#100DaysOfCode

 

 

 

継続は力なり

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

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

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

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

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

 

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

問題に当たったら、

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

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

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

 

前回、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

ちょっと無謀でも、やってみる

この記事がとてもよくて

qiita.com

 

一旦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文がそのまま書ける

www.psycopg.org

 

あと、大事なのはcommitは別なこと

closeしただけでは、反映されない

commit前にselectしてデータを見るとちゃんと反映されているように見えるのが、

間違いの元だ

 

executeすると自動的にcommitするようにするには

conn.autocommit = True

とすればいい。

hassiweb-programming.blogspot.com

 

あとは、postgresの権限の問題に悩まされた

一番わかりやすかったのが、これ

eng-entrance.com

 

postgresのユーザでログインして、そこからロール(ユーザ)を作って、そのロールにログインできる権限つけて、最後にアクセスしたいテーブルに許可しないとだめ。

 

上の3つをやるとはじめてテーブルが参照できた。

そこまでわかるのに1週間ぐらいかかってる。

これだから、データベース恐怖症になるのだな。

 

でも、これだけわかればあとはSQL文を学ぶだけ。

 

少し進んだかな。

3連休、楽しんだ。

 

065/100

#100DaysOfCode

少しずつやっていく

なんとか起動したpostgres

pgAdmin4というwebブラウザから見えるツールでコマンドラインでテーブルを作成して実際にどこにできるかを見てみた

www.dbonline.jp

まずはコマンドラインでログインから

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のブログを読みまくる

lets.postgresql.jp

 

できたと思って早速pythonから繋げられるかと思ってやってみる

 

www.ashisuto.co.jp

 

色々やってみたけれど、

roleがユーザだと思ったらユーザじゃなくて、

頭が混乱した

 

pgadmin4をインストールして、データ接続できるかどうか見てみたらなぜかできない。

postgresで接続してみたけれどどうもつながらない

 

itsakura.com

で、色々見てみたら、こういう記事があった

これでもやってみた

linux-svr.com

hogeユーザを作って、pgadmin4で接続するとできた

何が悪かったのだろう?

決定打はこれかな

postgres=# CREATE USER hoge WITH PASSWORD 'pass';

新しいユーザを作ってパスワード決めて接続するとできるのかな

今あるユーザーだとだめなのかな

よくわからない

 

でもサービスも再起動してみた

service postgresql restart

これが効いたのかな

pgadmin4でツリーが出てきたのには感激した

再びこれ

itsakura.com

そして、再びこれ

www.ashisuto.co.jp

 

>>> 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のツールも揃っているので・・

 

インストールに戸惑った

paperface.hatenablog.com

試してみないとわからない

上の方法だとubuntu 19ではだめだった

 

なので、元のwikiに従った

wiki.postgresql.org

このコマンドライン通りにやって、途中、

deb http://apt.postgresql.org/pub/repos/apt buster-pgdg main

は通らなかったけれど、インストールできた

 

ま、よしとしよう

 

ここから進めてみる

 

062/100

#100DaysOfCode