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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1090閲覧

株の銘柄情報の取得とSQliteへの格納

tomomonX

総合スコア28

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/06/20 09:05

編集2021/06/20 10:32

前提・実現したいこと

「株とPython-自作プログラムでお金儲けを目指す」という書籍でpythonの勉強をしています。
株の銘柄情報の取得とSQliteへの格納がしたいです。
下記リンクも参照しながら該当するソースコードを実行してみたのですが、
エラーメッセージが発生して先に進めないです。
https://bitop.hatenablog.com/entry/2019/04/09/060131
データベースもリンク通りDB Browser for SQliteを使っています。
Windows版(64bit)です。

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

python

1--------------------------------------------------------------------------- 2OperationalError Traceback (most recent call last) 3<ipython-input-16-c378ba6b20b8> in <module> 4----> 1 insert_brands_to_db('kabud.db',range(1301,1320)) 5 6<ipython-input-13-a7e9fa617c9c> in insert_brands_to_db(db_file_name, code_range) 7 37 sql = 'INSERT INTO brands(code,name,short_name,market,unit,sector) ' \ 8 38 'VALUES(?,?,?,?,?,?)' 9---> 39 conn.executemany(sql, brands_generator(code_range)) 10 11OperationalError: no such table: brands

該当のソースコード

from pyquery import PyQuery import time import sqlite3 def get_brand(code): url = 'https://kabutan.jp/stock/?code={}'.format(code) q = PyQuery(url) if len(q.find('div.company_block')) == 0: return None try: name = q.find('div.company_block > h3').text() code_short_name = q.find('#stockinfo_i1 > div.si_i1_1 > h2').text() short_name = code_short_name[code_short_name.find(" ") + 1:] market = q.find('span.market').text() unit_str = q.find('#kobetsu_left > table:nth-child(4) > tbody > tr:nth-child(6) > td').text() unit = int(unit_str.split()[0].replace(',', '')) sector = q.find('#stockinfo_i2 > div > a').text() except (ValueError, IndexError): return None return code, name, short_name, market, unit, sector def brands_generator(code_range): for code in code_range: brand = get_brand(code) if brand: yield brand time.sleep(1) #サーバーに迷惑をかけないための配慮 def insert_brands_to_db(db_file_name, code_range): conn = sqlite3.connect(db_file_name) with conn: sql = 'INSERT INTO brands(code,name,short_name,market,unit,sector) ' \ 'VALUES(?,?,?,?,?,?)' conn.executemany(sql, brands_generator(code_range))
insert_brands_to_db('kabud.db',range(1301,1320)) #勉強段階なので狭い範囲で試しています。

試したこと

ファイル名はkabud.dbにしたのですが、ここの名前を参照リンク通りbrands.dbにファイル名およびコードを変えても同じように

OperationalError: no such table: brands

のエラーがでます。下記のbrandsをたとえばbrandにいじるとエラーは
no such talbe:brandsに変わりました。

def insert_brands_to_db(db_file_name, code_range): conn = sqlite3.connect(db_file_name) with conn: sql = 'INSERT INTO brands(code,name,short_name,market,unit,sector) ' \#←ここのbrandsをいじるとエラーも変わる。 'VALUES(?,?,?,?,?,?)' conn.executemany(sql, brands_generator(code_range))

参照リンクhttps://bitop.hatenablog.com/entry/2019/04/09/060131のようにTableやfieldも入力したのですが、
なぜエラー(認識していない?)が起きるのかがわからないです。kabud.dbというファイルは確かに存在します。
わかる方解決策を教えてください。

##追記
修正依頼にありました、テーブルの状態について追記します。画像の通りです。
イメージ説明
https://bitop.hatenablog.com/entry/2019/04/09/060131
のリンクの通り進めています。
リンクの通りテーブル名をbrandsにするのも試してみたのですが、同様に

OperationalError: no such table: brands

になります。

##追記その2
saziさんのおっしゃる通りカレントディレクトリで解決しました。
イメージ説明
なぜか参照リンクhttps://bitop.hatenablog.com/entry/2019/04/09/060131のような
表への反映はされないですが、エラーは出なくなりました。

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

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

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

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

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

sazi

2021/06/20 09:31

sqliteでテーブルがどのような状態かを確認できていますか?
tomomonX

2021/06/20 09:45

コメントありがとうございます。テーブルの状態について追記しました。
sazi

2021/06/20 10:07 編集

カレントディレクトリにkabud.dbが無いと駄目だと思うのですが、DBファイルのパスはカレントディレクトリですか? Phytonは良く知りませんが、同じディレクトリ上に揃えないと駄目なのでは無いでしょうか。
tomomonX

2021/06/20 10:36

ありがとうございます。カレントディレクトリの問題でした。 エラー出ずに実行できました。 ありがとうございます。 SQliteにはなぜか反映されない(おそらく見えないだけのような気がする)ですが、最初に質問したことは解決できました。もしわかれば教えてほしいですが、なくてもベストアンサーにしたいので、追記修正ランじゃなくて、回答欄に回答いただければと思います。
tomomonX

2021/06/20 13:00

SQLにNoneと返す条件に当てはまりSQLへ格納できていないことを突き止めれました。 丁寧に教えていただきありがとうございました。
sazi

2021/06/20 13:38

回答に転記しました。
guest

回答1

0

ベストアンサー

カレントディレクトリにkabud.dbが無いと駄目だと思うのですが、DBファイルのパスはカレントディレクトリですか?
Phytonは良く知りませんが、同じディレクトリ上に揃えないと駄目なのでは無いでしょうか。

投稿2021/06/20 13:37

sazi

総合スコア25138

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

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

tomomonX

2021/06/20 13:44

ありがとうございます。カレントディレクトリの問題でした^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問