0

Python を介して SQL3 データベースで後処理を実行するにはどうすればよいですか? 次のコードは機能しませんが、私がやろうとしているのは、最初にデータベースがまだ存在しない場合は新しいデータベースを作成し、次にデータを挿入し、最後にクエリを実行して接続を閉じることです。しかし、後で削除/更新/などの追加機能を追加するために、個別に行う必要があります...何かアイデアはありますか?

class TitlesDB:
    # initiate global variables
    conn = None
    c = None
    # perform pre - processing
    def __init__(self, name):
        import os
        os.chdir('/../../')
        import sqlite3
        conn = sqlite3.connect(name)
        c = conn.cursor()
        c.execute('CREATE TABLE IF NOT EXISTS titles (title VARCHAR(100) UNIQUE)')
    # insert a bunch of new titles
    def InsertTitles(self, list):
        c.executemany('INSERT OR IGNORE INTO titles VALUES (?)', list)
    # perform post - processing
    def __fina__(self):
        conn.commit()
        conn.close()
4

2 に答える 2

0

前処理と後処理を行うコンテキスト マネージャーを作成できます。

import contextlib

@contextlib.contextmanager
def titles_cursor():
    # perform pre - processing
    conn = sqlite3.connect(name)
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS titles (title VARCHAR(100) UNIQUE)')

    yield c

    # perform post - processing
    conn.commit()
    conn.close()

withステートメントで使用します。

with titles_cursor() as c:        
    c.executemany('INSERT OR IGNORE INTO titles VALUES (?)', list)
于 2013-09-13T10:00:38.027 に答える
0

まず、SQL 接続を内部に配置しない方がよいのではないでしょう__init__か。を使用した後、同じインスタンスでこのクラスを使用する場合、問題が発生します__fina__。別のメソッドに入れて呼び出し、必要に応じて接続を閉じるメソッドを呼び出し、各メソッドの実行後にコミットすることができます。

これが私が使用するものです:データベースに接続し、引数からクエリを実行するクラスメソッドを作成し、接続をコミットして閉じ、そのメソッドの引数として実行したいクエリを渡します。いつでもこのメソッドを呼び出すことができます欲しいです。これについての最良の点は、db 接続を閉じる前に複数のクエリを引数として渡すメソッドを作成できることです。これは、SQL クエリを実行する必要があるたびに一連のメソッドを使用せずに、別のクラスの同じデータベースへの SQL 接続を使用する必要がある場合に特に便利です。

これは、MySQLdb モジュールで使用した小さな例です。かなり単純ですが、うまくいきました。

import MySQLdb

class DbQuery:
    '''Here is the class I talked about'''
    def __init__(self):
        '''You can define the main queries here but it's not necessary
           They can be global variables
           If you don't have class dependency from which you get variables
           you might not even need to define __init__'''
    def Sql_Connect(self):
        self.db = MySQLdb.connect("localhost","root","","data_db" )
        self.cursor = db.cursor()
    def Sql_Commit(self):
        self.db.commit()
        print "Info : Database updated"
        except:
           self.db.rollback()
           print "Error : Database rollback"
        self.db.close()
    def Query(self,query):
        self.Sql_Connect()
        try :
            self.cursor.execute(query)
        self.Sql_Commit()

唯一重要なことは、クエリ構造を覚えておくことです。

于 2013-09-13T09:43:51.350 に答える