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

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

新規登録して質問してみよう
ただいま回答率
85.46%
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回答

318閲覧

Pythonのsqliteの実行において該当のテーブルがあるにも関わらずno such tableがエラーとして表示される。

Niyary

総合スコア1

SQLite

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

SQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

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

0グッド

0クリップ

投稿2024/01/15 14:15

実現したいこと

sqlite3.OperationalError: no such table: cardlist
上記エラーを解決したい。

発生している問題・分からないこと

Duelmasters.db上に"cardlist"でテーブルが用意されているにも関わらずエラーメッセージにて"no such table: cardlist"が表示されています。

エラーメッセージ

error

1Exception in Tkinter callback 2Traceback (most recent call last): 3 File "C:\Program Files\Python312\Lib\tkinter\__init__.py", line 1962, in __call__ 4 return self.func(*args) 5 ^^^^^^^^^^^^^^^^ 6 File "C:\Users\8180\Desktop\python\1_DM\test.py", line 165, in btn_click_generate 7 find_card_information(conn,driver,cardlink,listcards) 8 File "C:\Users\8180\Desktop\python\1_DM\test.py", line 96, in find_card_information 9 update_database(conn, elems_head, elems_packname, elems_data, picturl) 10 File "C:\Users\8180\Desktop\python\1_DM\test.py", line 19, in update_database 11 duplicate = cur.execute('SELECT * FROM cardlist\ 12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 13sqlite3.OperationalError: no such table: cardlist 14

該当のソースコード

import os import tkinter as tk from tkinter import ttk from tkinter import messagebox from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.service import Service import re import time import requests import sqlite3 dbname = 'Duelmasters.db' conn = sqlite3.connect(dbname) def update_database(conn, elems_head, elems_packname, elems_data, picturl): cur = conn.cursor() # 既にデータベース登録済みのカード名はデータベースに登録しない duplicate = cur.execute('SELECT * FROM cardlist\ WHERE cardname LIKE ?\ AND typetxt LIKE ?', ('%'+elems_head[0].text+'%','%'+elems_data[1].text+'%'))

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13261601893

補足

特になし

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

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

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

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

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

meg_

2024/01/15 14:49

\ を削除したらどうなりますか?
melian

2024/01/15 14:55

念の為、sqlite3 コマンドでテーブル名を確認してみてはどうでしょうか。 sqlite3 Duelmasters.db sqlite> .tables   :
bsdfan

2024/01/15 22:49

テーブルがあるはずのDuelmasters.dbと、プログラムで開いているDuelmasters.dbが違うファイル(ディレクトリ違い)だったりしませんか。 sqlite3.connect は、ファイルがない場合、エラーではなく新規作成しようとするので、そういう状況のなりがちです。
otn

2024/01/16 01:37

↑でしょうね。 そのエラーメッセージは該当テーブルがないことを示しているので、 ファイル名やテーブル名のタイプミスがないとすると、 ・あなたがcardlistがあると思っているDuelmasters.db ・プログラムがcardlistがないと言っているDuelmasters.db の2つが別物であることは明らかです。 おそらく、dbname = 'Duelmasters.db' のようにディレクトリを指定しないファイル名だけを書くと、スクリプトと同じディレクトリのファイルを使うと思っている事による間違いでしょう。同様の間違いによる質問が過去に多数なので、初心者あるあるですかね。 この場合は、実行時のカレントディレクトリーにあるファイルガ使われます(or作られます)。 スクリプトと同じディレクトリのファイルを指定したい場合は、スクリプトの場所を__file__で調べてそのディレクトリ名をファイル名に付加します。
Niyary

2024/01/20 00:50

出張でしばらくレスポンスできておらず申し訳ございません。 ご回答いただき誠にありがとうございます。ディレクトリ指定していないために発生しているということで、まずは試してみます。
Niyary

2024/01/20 07:25

試してみましたがダメでした・・・。 ■実行したコード import os import tkinter as tk from tkinter import ttk from tkinter import messagebox from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.service import Service import re import time import requests import sqlite3 dbname = r'C:\Users\81801\Desktop\python\1_DM\Duelmasters.db' conn = sqlite3.connect(dbname) def update_database(conn, elems_head, elems_packname, elems_data, picturl): cur = conn.cursor() # 既にデータベース登録済みのカード名はデータベースに登録しない duplicate = cur.execute('SELECT * FROM cardlist\ WHERE cardname LIKE ?\ AND typetxt LIKE ?', ('%'+elems_head[0].text+'%','%'+elems_data[1].text+'%')) ■エラーメッセージ Exception in Tkinter callback Traceback (most recent call last): File "C:\Program Files\Python312\Lib\tkinter\__init__.py", line 1962, in __call__ return self.func(*args) ^^^^^^^^^^^^^^^^ File "C:\Users\81801\Desktop\python\1_DM\test.py", line 165, in btn_click_generate find_card_information(conn,driver,cardlink,listcards) File "C:\Users\81801\Desktop\python\1_DM\test.py", line 96, in find_card_information update_database(conn, elems_head, elems_packname, elems_data, picturl) File "C:\Users\81801\Desktop\python\1_DM\test.py", line 19, in update_database duplicate = cur.execute('SELECT * FROM cardlist\ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ sqlite3.OperationalError: no such table: cardlist
otn

2024/01/20 10:52

エラーメッセージから、 C:\Users\81801\Desktop\python\1_DM\Duelmasters.db に、cardlist がないのは事実なので、その事実を前提として、原因を探ると良いかと思います。 まずは、「タイプミスは命賭けて無い!」と言い切れるかの確認からでしょうか。 ファイル名やテーブル名は、都度タイプせずに、全部コピペしていますか? また、sqlite3コマンドが使えるなら、 echo .tables | sqlite3 C:\Users\81801\Desktop\python\1_DM\Duelmasters.db で、テーブル一覧を表示。
Niyary

2024/01/28 13:47

コメントありがとうございます。⚪︎⚪︎を試したところ問題が解決しました! ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
otn

2024/01/28 13:57

> ⚪︎⚪︎を試したところ問題が解決しました! 「⚪︎⚪︎」とは? 何が原因だったのでしょうか?
Niyary

2024/02/04 12:46

コメントありがとうございます。ちゃんとDBファイルを作り直し、パスの場所に置くことで解決しました。 ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか? 回答: ①DBファイルを作成 ②DBファイルを作成したファイルの絶対パスを記入。 dbname = r'C:\Users\8801\Desktop\python\1_DM\Duelmasters.db'
guest

回答1

0

コメントより転記:
そのエラーメッセージは該当テーブルがないことを示しているので、
ファイル名やテーブル名のタイプミスがないとすると、
・あなたがcardlistがあると思っているDuelmasters.db
・プログラムがcardlistがないと言っているDuelmasters.db
の2つが別物であることは明らかです。

おそらく、dbname = 'Duelmasters.db' のようにディレクトリを指定しないファイル名だけを書くと、スクリプトと同じディレクトリのファイルを使うと思っている事による間違いでしょう。同様の間違いによる質問が過去に多数あります。

dbname = 'Duelmasters.db' のように相対パスで書くと、そのプログラムのプロセスのカレントディレクトリからの相対、つまり、カレントディレクトリにある'Duelmasters.db'が対象になります。このファイルが無い場合には、例えば普通の読み取り用のオープン等であれば、「ファイルが見つからない」というエラーになりますが、Sqlite3の場合は無ければなんのメッセージも出さずに作成されるようです。sqlite3.connectに「存在しなければエラーにする」というオプションはなさそうです。
(更新しないなら、sqlite3.connect("file:Duelmasters.db?mode=ro",uri=True)と読み取り専用を指定すれば、無い場合にエラーにできる)

相対パスの起点であるカレントディレクトリーはプログラムの実行の仕方で決まります。
初心者によくある間違いは、プログラムファイルがある場所からの相対だと思ってしまうことです。

場所が固定されているファイルの指定をする場合の書き方は、
案1:実行時のカレントディレクトリーを把握してそこからの相対パスを書く
案2:絶対パスで書く。Linux/Unixなら/で始まるパス。Windowsならドライブ文字:\\で始まるパス
案3:プログラムファイルと同じ場所(同じ場所のディレクトリの下などプログラムファイルからの相対パスが固定されている場合)のファイルを使う場合は、プログラムファイルの場所を調べて(Pythonだと__file__)パス名加工関数(os.path.~等)を使って、目的のファイルの絶対パスを合成する
です。
ウェブアプリだと、プログラムファイルの場所がカレントディレクトリーになるのが普通なので案1が可能。
(WindowsのExplorerからプログラムファイルをダブルクリックで起動した場合もそう(例外あり))
OS標準のファイルとか、絶対パスでの場所が変動しないケースは案2。
プログラムファイルからの相対パスが固定されている場合は案3。
どれでも無い場合はケースバイケースで。
プログラム起動時の引数で与えるとか、環境変数に絶対パスを設定するとかの選択肢もあり。

投稿2024/02/04 13:49

otn

総合スコア84769

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問