2016-08-13 5 views
0

私はpythonのsqlite3 APIを使用してデータベースを作成しています。 すべての例では、ドキュメントテーブルの名前と列名がハードコードされていますが、同じテーブルを複数回使用すると、潜在的な問題になる可能性があります(つまり、テーブルの作成、テーブルへのレコードの挿入、テーブルからテーブルを変更するなど)テーブル変更の場合は、複数の場所でハードコードされた名前を変更する必要があります。これは良いプログラミング方法ではありません。 どうすればこの問題を解決できますか? 私はこのコンストラクタメソッドを使ってクラスを作成し、この文字列の名前をすべて格納し、クラス内で使用することを考えました。しかし、私は専門家のpythonプログラマーではありません。 ...複数の再利用のためのテーブル名とカラムを格納するPythonとsqlite3データ構造

class TableA(object): 
    def __init__(self): 
     self.table_name = 'tableA' 
     self.name_col1 = 'first_column' 
     self.type_col1='INTEGER' 
     self.name_col2 = 'second_column' 
     self.type.col2 = 'TEXT' 
     self.name_col3 = 'third_column' 
     self.type_col3 = 'BLOB' 

、その後のDBクラッセ

table_A = TableA() 

def insert_table(self): 
    conn = sqlite3.connect(self._db_name) 
    query = 'INSERT INTO ' + table_A.table_name + ..... <SNIP> 
    conn.execute(query) 

の内側にこれを続行する適切な方法ですか?

答えて

0

クラスを使用してデータベーステーブルの抽象化レイヤを提供する場合は、ORMの使用を開始することもできます。いくつかの例はSQLAlchemySQLObjectです。どちらも非常に人気があります。ここで

はSQLAlchemyのの味です:もちろん

from sqlalchemy import Column, Integer, String 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import create_engine 

Base = declarative_base() 

class TableA(Base): 
    __tablename__ = 'tableA' 
    id = Column(Integer, primary_key=True) 
    first_column = Column(Integer) 
    second_column = Column(String) 
    # etc... 

engine = create_engine('sqlite:///test.db') 
Base.metadata.bind = engine 

session = sessionmaker(bind=engine)() 

ta = TableA(first_column=123, second_column='Hi there') 
session.add(ta) 
session.commit() 

あなたは、テーブルと列のためのセマンティック名を選ぶだろうが、あなたは、テーブルを宣言すると、あなたの中で提案されたものの線に沿って何かであることがわかります質問、すなわちクラスを使用する。レコードの挿入は、そのクラスのインスタンスを作成することによって簡単になります。

0

私は何が適切かはわかりませんが、私はあなたに伝統的ではないことを伝えることができます。

テーブルをクラスとして実際に構造化したい場合は、オブジェクトリレーショナルマッパーをSQLAlchemyのように考えることができます。さもなければ、あなたはそれについて何をしているのですか?どのように多くの列変数があるのか​​、どのように知っていますか? 2項目リストのリストを保存するのはどうですか?または辞書のリスト?

self.column_list = [] 
self.column_list.append({'name':'first','type':'integer'}) 

あなたのやっていることはかなり斬新なようです。コードをチェックして、どのように動作するかを確認してください。

0

個人的には、正当な理由なしにライブラリやフレームワークを使用したくないです。だから私がそのような理由なら、sqliteの周りに思考ラッパーを書くだろう。

class Column(object): 
    def __init__(self, col_name="FOO", col_type="INTEGER"): 
     # standard initialization 

そして、あなたが欲しいのデータベースですべての操作をカプセル化することができますデータベースのテーブルクラスで

class Table(object): 
    def __init__(self, list_of_columns, cursor): 
     #initialization 
    #create-update-delete commands 

で操作をカプセル化して、テーブルクラス。

関連する問題