14

いくつかのSQLiteテーブルを作成してデータを取り込むPythonモジュールを作成しました。今、プログラムで使いたいのですが、きちんと呼び出す方法がよくわかりません。私が見つけたすべてのチュートリアルは本質的に「インライン」です。つまり、SQLiteを実際に本番環境で使用する方法ではなく、線形に使用する方法を説明しています。

私がやろうとしているのは、データベースがすでに作成されているかどうかを確認するためのメソッドチェックを行うことです。もしそうなら、私はそれを使用することができます。そうでない場合は、例外が発生し、プログラムがデータベースを作成します。(または、if / elseステートメントのどちらか良い方を使用します)。

ロジックが正しいかどうかを確認するためのテストスクリプトを作成しましたが、機能していません。tryステートメントを作成すると、データベースが既に存在するかどうかを確認するのではなく、新しいデータベースを作成するだけです。次にスクリプトを実行すると、例外をキャッチしようとしても、テーブルがすでに存在するというエラーが表示されます。(私は以前にtry /exceptを使用したことがありませんが、これは学ぶのに良い時期だと思いました)。

SQLiteを操作上使用するための優れたチュートリアルや、これをコーディングする方法に関する提案はありますか?私はpysqliteチュートリアルと私が見つけた他のものを調べましたが、それらはこれに対処していません。

4

8 に答える 8

29

これを必要以上に複雑にしないでください。大規模な独立したデータベースには、複雑なセットアップと構成の要件があります。SQLite は、SQL でアクセスする単なるファイルであり、はるかに単純です。

以下をせよ。

  1. 「コンポーネント」、「バージョン」、「構成」、「リリース」などの管理用のテーブルをデータベースに追加します。

    CREATE TABLE REVISION( RELEASE_NUMBER CHAR(20) );

  2. アプリケーションで、通常どおりデータベースに接続します。

  3. リビジョン テーブルに対して簡単なクエリを実行します。これが起こり得ることです。
    • クエリの実行に失敗しました: データベースが存在しないため、一連の CREATE ステートメントを実行して構築します。
    • クエリは成功しますが、行が返されないか、リリース番号が予想よりも低くなっています: データベースは存在しますが、最新ではありません。そのリリースから現在のリリースに移行する必要があります。これを行うには、一連の DROP、CREATE、および ALTER ステートメントが必要です。
    • クエリは成功し、リリース番号は期待値です。データベースは正しく構成されています。
于 2008-10-17T10:30:02.670 に答える
13

私の知る限り、SQLITEデータベースは単なるファイルです。データベースが存在するかどうかを確認するには、ファイルの存在を確認します。

SQLITE データベースを開くと、それをバックアップするファイルが配置されていない場合、自動的にデータベースが作成されます。

データベースではない sqlite3 データベースとしてファイルを開こうとすると、次のようになります。

「sqlite3.DatabaseError: ファイルが暗号化されているか、データベースではありません」

そのため、ファイルが存在するかどうかを確認し、ファイルが sqlite3 データベースでない場合は、必ず例外をキャッチしてください。

于 2008-10-17T09:23:01.260 に答える
7

SQLite は、最初に使用しようとしたときにデータベース ファイルを自動的に作成します。テーブルを作成するための SQL ステートメントはIF NOT EXISTS、テーブルが作成されていない場合にのみコマンドを有効にするために使用できます。この方法では、事前にデータベースの存在を確認する必要はありません。

私がまだ心配している主な点はCREATE TABLE IF EXISTS、すべての Web トランザクション (たとえば) に対して実行するのは非効率的だということです。プログラムが今日データベースを作成したかどうかを示す(メモリ内の)変数を保持することで、これを回避できます。そのため、CREATE TABLEスクリプトは実行ごとに1回実行されます。これにより、データベースを削除して、デバッグ中に最初からやり直すことができます。

于 2008-10-17T09:44:53.760 に答える
5

@diciu が指摘したように、データベース ファイルはsqlite3.connectによって作成されます。ファイルがそこにないときに特別なアクションを実行したい場合は、明示的に存在を確認する必要があります。

import os
import sqlite3
if not os.path.exists(mydb_path):
    #create new DB, create table stocks
    con = sqlite3.connect(mydb_path)
    con.execute('''create table stocks
      (date text, trans text, symbol text, qty real, price real)''')
else:
    #use existing DB
    con = sqlite3.connect(mydb_path)
...
于 2008-10-17T09:40:12.880 に答える
4
  • 同じ名前で新しいデータベースを作成しても、Sqlite は例外をスローせず、それに接続するだけです。sqlite はファイル ベースのデータベースであるため、ファイルの存在を確認することをお勧めします。
  • 2番目の問題については、テーブルが既に作成されているかどうかを確認するには、例外をキャッチしてください。テーブルが既に存在する場合、例外「sqlite3.OperationalError: table TEST already exists」がスローされます。
import sqlite3
import os
database_name = "newdb.db"
if not os.path.isfile(database_name):
    print "the database already exist"
db_connection = sqlite3.connect(database_name)
db_cursor = db_connection.cursor()
try:
    db_cursor.execute('CREATE TABLE TEST (a INTEGER);')
except sqlite3.OperationalError, msg:
    print msg
于 2008-10-17T09:26:07.307 に答える
3

全体的にSQLを実行することは、私が選んだどの言語でも恐ろしいことです。SQLalchemy は、実際のクエリとそれを使用したコミットが非常にクリーンでトラブルがないため、最も使いやすいことが示されています。

アプリで sqlalchemy を実際に使用するための基本的な手順を次に示します。詳細については、ドキュメントを参照してください。

  • テーブル定義を提供し、ORM マッピングを作成する
  • データベースをロード
  • 定義からテーブルを作成するように依頼します (テーブルが存在する場合は作成しません)。
  • セッションメーカーの作成 (オプション)
  • セッションを作成

セッションを作成したら、コミットしてデータベースからクエリを実行できます。

于 2008-10-17T09:24:13.350 に答える
0

はい、私は問題を解決していました。私がする必要があったのは、ファイルをチェックして、存在しない場合は IOError をキャッチすることだけでした。

他のすべての回答に感謝します。それらは将来的に役立つかもしれません。

于 2008-10-18T05:19:05.167 に答える