ORM、詳細な思考

最初の部分

以下からのインポートのMySQL mysql_singleton 


#クラスフィールド最初の作成
:クラスのフィールドを、(オブジェクト)
    DEF __init __(自己、名前、COLUMN_TYPE、PRIMARY_KEY、デフォルト):
        self.name =名前
        self.column_type = COLUMN_TYPE 
        self.primary_key = PRIMARY_KEY 
        self.default =デフォルト


#我々は、短いフィールドクラスの作成
などタイプint型のフィールドクラスとして#
クラスIntegerFieldと(フィールド):
    __init __(自己、名前、COLUMN_TYPE = "int型"、偽= PRIMARY_KEY、デフォルト= 0)DEF: は親クラスを呼び出してください__init__メソッド
        スーパー().__のinit __(名前、COLUMN_TYPE、PRIMARY_KEY、デフォルト)


#クラスstrのフィールド定義
クラスStringField(フィールド):
    __init __(自己、名前、COLUMN_TYPE = "VARCHAR(32)、" DEF、PRIMARY_KEY = falseの場合、デフォルト=なし):必ず親クラスの__init__メソッドを呼び出します 
        スーパー()のinit __(名前、COLUMN_TYPE、PRIMARY_KEY、デフォルト).__ 


#私たちは私たちのクラスのテーブル作成制限するメタクラスを書くこの時間の
クラスMyMetaClass(タイプ):#実際に、私たちは、このパラメータがあることclass_attrsを修復
    DEF __(CLS、CLASS_NAME、class_cases、class_attrs)を__new:
        CLASS_NAME ==「モデル」のIF: これはモデルクラスの場合は、直接リターンオブジェクトのいずれかの直接の修理なしでは、
            タイプ.__ new__を返します(CLS、CLASS_NAME、class_cases、class_attrs)
        #1 CLASS_NAME作成クラス名テーブルクラス
        #のclass_casesテーブルクラスが親クラスを継承作成し
        、#1 class_attrsは、名前空間のテーブルクラスを作成した辞書
        は名前がない場合、#テーブル名を私たちは、クラステーブルのクラス名を使用しません
        TABLE_NAME = class_attrs.get(「TABLE_NAME」、CLASS_NAME)
        主キーの名前受け取る変数を定義#を
        PRIMARY_KEYを=なし 
        テーブルのフィールドの全てを受信するために、#変数辞書を定義
        } {マッピング= 
        #ループ、キーと値のペアの形式で辞書の名前空間のテーブルクラスの割り当ては二つの変数を抽出するために、
        #kを、V我々はとしてそれを見ることができますフィールドの名前であり、kは、Vを指す変数であり、Vは、フィールドインスタンス化オブジェクトであり
        、これは項目()に追加しなければならないこと#注
        :class_attrs.items()におけるkは、V 
            #プリント(「%sは--- %S -------「%(K、V)) のVオブジェクトがフィールドオブジェクトクラスがインスタンス化されてフィールドであるかどうかを、判定され、kは可変フィールドオブジェクト点Vであるが、フィールドV.NAMEあります名前
            でisinstance(V、フィールドは、)IF: 
                #、この辞書へのV Tongeマッピングkをする場合は
                、マッピング[K] = Vの
                #をこのフィールドがTrue PRIMARY_KEYか否かを判断し、もしそうであれば、主キーフィールド
                v.primary_key IF:
                    :PRIMARY_KEY IF 
                        彼らが持っている場合は、この表は、主キーの友人を持っているかどうか#裁判官、投げ
                        上げはTypeError(「テーブルには1つのプライマリキーを持つことができます」)
                    #この分野の主キーは、変数PRIMARY_KEYのに割り当てられた名前に 
        class_attrs [「マッピング」] =マッピング
                    #(注)、vがv.nameは、フィールドの名前で、オブジェクトです。名前はPRIMARY_KEYに割り当てられている
                    PRIMARY_KEY = V.NAME 
        #フィールドオブジェクトのマッピングkのポイントを循環し、Vフィールドに変数ポインティングオブジェクト
        mappings.keysにおけるkのため)(: フィールドには、クラス内のすべての表スペースの名前を入力しますk個の削除によってオブジェクト、
            class_attrs.pop(k)を
        PRIMARY_KEYていない場合:
            昇給の例外TypeError(「表に主キーを持っている必要があります」) は、テーブルに、このクラスの名前空間辞書テーブルの名前を追加します。
        TABLE_NAME」[class_attrsを「] = TABLE_NAME 
        #フィールドの名前を追加し、名前空間のテーブルクラス辞書にテーブルの主キー
        class_attrs [」PRIMARY_KEY「] = PRIMARY_KEY 
        #このテーブルのフィールドのすべてを対象とします辞書には、この表に追加しています名前空間辞書クラス
        #最後に、我々は、元のクラスメソッドの外に見える、それは私たちがオブジェクトのインスタンスを与え、調整しなければならない戻り値の型.__新しい__(CLS、 CLASS_NAME、class_cases、class_attrs)
        タイプ.__ __新しい新しいリターンの(CLS、CLASS_NAME、class_cases、class_attrs)


クラスは辞書で渡された複数のキーワードをサポートする彼のパスパラメータを継承することができますので、#は、ミドルクラスを定義し、辞書オブジェクトをインスタンス化することができ
、その後の内部書き換える#を点法、どのような物点値の学生をサポートするために使用することができ、オブジェクト辞書は、プロパティ何かサポートしていませんする必要があります
:クラスモデル(辞書、MyMetaClassを=メタクラス)
    #** kwargsからは、キー任意の数のパラメータを渡すことができ
    デフを__init __(自己、** kwargsから):
        スーパー().__のinit __(** kwargsから)

    #オブジェクトポイントゾディアックの兆候は、このメソッドはトリガされない場合
    、我々は、このクラスの派生クラスは、ポイントを使用することができます作成するときに、主に#をこの方法は、この時点で生成された値は、対象の辞書の特徴があり
    、我々は辞書の値を指摘することができます#、あなたがポイントで、辞書の値を変更することができ
    DEFの__getattrの__(自己、アイテム): リターンself.get 「このキーなし」の項目、)
 
    として#ゾディアック目標点は、この値を変更するためには、このメソッドをトリガーします
    DEF __setattr __(自己は、キー、値):
        セルフ[キー] =値

    #クエリする必要がありますが、私たちが必要とする情報は、すべての情報テーブルを取得することができ、カテゴリによって、テーブルであります
    実際には#、オブジェクトのバインド方法は、テーブルの名前を得ることができますが、我々は、データテーブル内で見つけたパッケージ辞書のリストです
    #私たちは、それがオブジェクト辞書をインスタンス化します、ブラケットと呼ばれるキーワードの着信CLSの形で値の辞書でなければなりません
    #私たちは、このオブジェクトを取得することができ、我々はこのクラスのモデルを継承し、することができます点法の内部使用し
    、我々はオブジェクトディクショナリの中に入ることができる方法のプロパティ値を指すことができます#直接オブジェクトを、オブジェクトもゾディに等しいどのような値学生を指し示すことができる
    の値を変更することができます#オブジェクト辞書
    @classmethod 
    SELECT DEFを(CLS、* kwargsから*):
        #mysqlの呼び出し、このクラス
        MS = MySql.singleton() パラメータは、着信があるかどうかを判断するために
        kwargsからは、そうでない場合:
            #引数がない場合、私たちは、SQL文の綴る、テーブル名を取得する
            SQL =「を選択* %のcls.table_nameの「から%のS 
            #のmysqlはその後、selectメソッドを呼び出しますが、検索はコンテンツを返し
            RES = ms.select(SQL)
        他: 
            kはリスト=(kwargs.keys())[0] 
            kwargsから辞書に#変数名及びキーワードはに対応する値をとります 
            #あった場合パラメータ渡し、我々は、すべてのキーワード引数の変数名に応じてキーを取得するために、一つだけを取るすべてのパラメータを定義します
            #リストは、リストへの直接発電機は、我々は最初の値をとる 
            0 [RESが私たちは、このオブジェクトをオブジェクトのクラスのインストール済みインスタンスのリスト削除され、この時間は追加する時間であること#(注) ]
            kwargs.get = V(K) スプライシングは、最後のSQL文、我々はパラメータのペンダント単語を戦うために持っているとき、我々は戦う直接できないことに注意してください、私たちは取得できますか?プレースホルダ
            SQL =%(Cls.table_name、K) "Sは%Sの%から=?* WHERE SELECT" 文字列は、その後に置き換えられていますか?特許Sの%を置き換え
            SQL = sql.replace( "?"、 "%S") を、次に選択方法MySQLを呼び出し、調査の内容を返す
            RES = ms.select(SQL、V)
        位クエリメッセージがあるかどうかを決定します返す
        IF RESを:
            #がある場合、我々はパッケージの辞書のリスト、式の混乱のリストを取得します。
            #辞書オブジェクトにすることにより、キーワード引数として辞書**休憩、入ってくるクラスブラケット、例のうち各サイクル
            #はする必要があります私たちのクラスは、このクラスのモデルを継承しており、このクラスは、右のdictを継承します辞書カテゴリ
            これらのキーワード、パラメータ、辞書オブジェクトの変換されたときにインスタンス化# 
            RESを返します
            #これは、ORMのの本質である
            [R&LT RESためにCLS(R&LT **)] RESを= 
                この場合は、辞書自己あること#注これは、[CLS(** R)クエリのRES =介してデータの外にある解像度でRについて] 得られました

    up_date DEF(自己):
        MS = MySql.singleton()
        #「ID = WHERE更新ユーザ名SET 1 = 12である」
        #古いマスター鍵保存する変数定義
        フィールドを= [] 主キーに対応する値を格納する変数を定義
        PRをなし= 
        #フィールドの値を格納する変数を定義する
        値= [] 
        印刷サイクル位マッピングフィールド
        #プリント(self.mappings)
        self.mappings.items()におけるK、Vのための:
            #は、フィールドが主キーフィールドであるかどうかを決定します
            印刷#(K、V) プリント(v.primary_key)
            IF v.primary_key: それは、辞書の内容は、フィールド内のマッピングに対応することができる呼び出す辞書オブジェクトの結果である、ワン
                #によってそれほど反射フィールドに対応する値を取得するために
                、PR = GETATTR(自己、v.name、 v.default)
            他:
                名前のスペルを#=?フォーマットは、SQL文は、あなたが直接書き込むことができます戦いになります
                fields.append(V.NAME +「=?」) すべてのフィールドの値が値がない場合は、沈黙の値が取り、値のリストに追加され
                た値を.append(GETATTR(セルフ、V.NAME、v.default)) スペルSQL文
        = "アップデート%sの設定%のSQL %(self.table_name、%S =%sのsの" ""。(フィールドに参加)、self.primary_key、PR)
        #SQLの?Sの%を置き換える
        SQLを= sql.replace( "?"、 "%S") のMySQLの実行メソッドを呼び出し、SQLステートメントが実行され、着信中のフィールドの値に対応する値
        ms.execute(SQL、値)

    保存DEF(セルフ):
        MS = MySQLの。

        シングルトン()は、 フィールド= [] 
        位の対応する一方、変数の数とフィールドの対応する数、フィールド間の関係を定義しますか?
        引数= []
        #各フィールドの値に変数を定義します。
        =値は[] は、それ以外の場合はエラーになり、このサイクルは、Vキーと値のペアは、アイテムがバックマッピング()に書き込まれなければならないkの辞書でなければならないことに注意
        self.mappings.items()におけるk、Vため :{「ID」を:「上記のID」、「名前」:「名前」、「パスワード」:「パスワード」} サイクルは、主キーフィールドではありません
        v.primary_key IFません:
            #フィールドには、リストに主キーは、ありませんが、ノートを追加する必要がありますフィールドの名前ではなく、このフィールドのVの目的である
            field.append(V.NAME) 意志は?数番号はフィールドの数に加算される対応する
            (「?」)args.append 
            #フィールドがリストに、値に対応
            values.append(GETATTR(セルフ、V.NAME、v.default))

    SQL =「INSERT %S INTO(%S)の値(%S) "%(self.table_name、" ,. "参加(フィールド)、" ,.「参加(引数))
    ms.execute(SQL、


    クラスユーザ(モデル):
        上記のid = IntegerFieldと(名前=「上記のIDを述べた」、PRIMARY_KEY =真)に述べた
        名前= StringField(名前=「名前」)
        パスワード= StringField(名前は=「パスワード」)


    のデータベースに#クエリデータ
    クラスと#をメソッド呼び出しを選択する
    #User.select RES =() は、パッケージ・オブジェクトのリストを返し、我々は物体添字除去
    位オブジェクトは、辞書オブジェクトである
    #dict_objの=のRES [0] 
    データアクセスオブジェクトの#
    #プリント(dict_obj。名)

    #データベース内のデータを変更
    、我々は、変更したいデータ照会する最初の#
    User.select(名前=「タンク」)=#RESを
    #は辞書オブジェクトの取得
    [0]#のdict_objの= RESを
    #点法で辞書を変更します名前フィールドの値
    =「ジャック」#のdict_obj.name  
    #データ呼up_dateを変更
    #1 dict_obj。up_date() 

    #は、データベースにデータを増加
    辞書オブジェクトをインスタンス化するために、我々は、キーワードパラメータを渡す最初# 
    #のdict_objを=ユーザー(名前=「タンク」、パスワード=「123」)
    dict_obj =ユーザー(名前= 「タンク」) 
注; 
    #私たちは、時間を節約するには、パラメータを渡す場合、このフィールドは外のクラステーブルのフルサークルの対象になります
    。#そして、フィールド名の対象外
    #これはGETATTRでありますオブジェクトをインスタンス化することは価値があるパスワードを指定していないときに我々がする必要がありますように、それを価値がない
    オブジェクトのプロパティがポイント法引き金となるので#、__ getattr__方法は、そうでない場合は値を取得するために、このデフォルト値の
    #は、私たちは時間の値を渡します各フィールドが渡さなければなりません

    #を、データ増やす方法出て保存する辞書オブジェクトを使用し
    dict_obj.save()

「」 " 
1親クラスのフィールドを作成しますが、フィールドタイプの1が同じではない、我々はすべての時間を持って、私たちINITを書くので、私たちは、フィールドのタイプに応じて、に持っている
別のフィールドを作成する

フィールドの異なるタイプの作成に2を

3つのフィールドから作成し、我々は値を渡す必要がありますが、伝統的な価値観はまだ、この状態を初期化する必要があります トラブル、私たちは、このようなことが可能なモデルの継承のdictクラスから出てくると思った
、無制限の着信キーワード引数辞書オブジェクトを返します。

4しかし、我々は辞書オブジェクトから作成され、オブジェクトは、プロパティ値のポイントをサポートできないので、我々は、点法を書き直し、

容易に私たちはメタクラスによって、我々が作成したオブジェクトテーブルを作成するプロセスを制御する必要が5、でき名前空間の名前は、内のテーブルのクラスでそれにアクセスするには
、主キーテーブル、およびすべてのフィールドのテーブルに
は、まず、メタクラスを継承するクラスを作成し
、当社の継承されたクラスはミドルクラスを作成するためにあなたと私ではありません判断しますまた、ヘルパークラスとして知られている(モデル)は、
もしそうなら、私たちは変更せずに、彼の主題に戻ってくる
、私たちはこのクラスの名前空間特定の適応を持つことになりますされていない場合、
我々は最初に、すなわちテーブルを維持するために、三つの変数を定義します名前、テーブルのプライマリキーは、テーブルのすべてのフィールド
最初のネームスペース、table_nameのキーと値のペアを見つけ、我々は、テーブルの名前を識別するために、定義された変数に値を代入
しますが、この値を考え出すことができる範囲テーブルの後ろに名前を
名前空間のループ内のすべてのキーと値のペア、判定値の値は、我々は、フィールドのクラスオブジェクトの外に作成するかどうかの鍵となる
ことがある場合は、すべてのフィールドはポールです 私たちの定義された変数に
して、また、我々が作成した変数に割り当てられた主キー、誰であるかを判別
今回、私たちは、変数のすべてのフィールドに入れている
今、私たちは、変数について話すうちk個
に応じ行きますこれらのフィールドのすべてのクラスを削除するには、k個のテーブルには、私は、私たちのフィールドは、当社の変数に保存されている必要があります
最後に、辞書の名前空間テーブルに変数の私達の定義について話私たちを救う
それを呼び出す、最後に後のオブジェクトを変更するために私たちを返すメタクラス新しい方法

6は、今、我々はそれmysqlのクラス定義
のSQL文を照会する方法をサポートし、私は私たちに、SQLに保存された戻りデータを与えます
SQL文を実行するための方法がある
。最後に、私たちはあるべき単一のクラスには、このクラスの話を、このクラスは、複数のオブジェクトを作成する必要がある
あなたも資源節約することができるように、

必要があり、我々はすべて7テーブルクラスは、ミドルクラスのモデルを継承されます
私たちは、このクラスでは、このクエリのSQLステートメントのモデルを記述する必要がありますので、このメソッドは、辞書オブジェクトを返します。
我々は、このクラスのMySQLが書いた私たちの呼び出しに
オブジェクトを返す
と、ユーザーかどうかを判断しますそのようなデータ転送として、何のパスのキーワードパラメータが存在しない場合は、私たちのようなこのテーブルのテーブル名を取得することができます
モザイクSQL文
法のmysqlのオブジェクトが渡されたSQLステートメントを呼び出すを、それは私が必要なものを辞書を返します。オブジェクトは
、後続の変更は、私たちはあなたの顔の値を変更するには、この辞書オブジェクトを取得する必要がありますする必要があり
ますが、値を渡した場合、我々は最初のキーと値のペアを取る
SQL文をステッチその後、K、Vを削除している、ここで注意キーワード引数のSQL文は、実行することにより、スプライスされなければならない
私たちが最初に使用することができますか?占有

8データベース内のデータを変更し、mysqlはまだオブジェクトをインスタンス化する必要があり
、我々は文をSQL文として、「主キーのデータ名=データ=更新テーブルセットのフィールド名」である必要があり
、その後は店に三つの変数を見つける必要があり主キー、フィールド名、フィールド名の値
我々はメタクラスの結果は、クラスを作成する方法に変更されたテーブルクラスのうちの作成私たち最初のループ
も、テーブルのすべてのフィールドのリストを、当社の預金の名前のリストを持っており、テーブルの主キーがあります
ので、我々は最初のスクリーニング主キーを持つすべてのフィールドの可能
反射を通じて、主キーの値を取得するために


理解の焦点を: 
:なぜここにGETATTRの値ができ
はず、ここでは、なぜ我々はリフレクションを通じて、主キーの値を取得することができ私たちは、データベースの価値は時間修正するために
、このクラスに渡された括弧のキーワード引数でこれらの値を呼び出すために、それはある辞書オブジェクトのうち、オブジェクトをインスタンス化
、我々はバイポイント法は、この値の辞書オブジェクトを修復すること、その後、その後、この貫通私たちは、このメソッドを呼び出すオブジェクトの修理
すべてのこの時間のためには、オブジェクトディクショナリの構造上の辞書オブジェクトの修理後、この自己であります フィールドの名前は次のとおりです。データは
、我々がフィールドの外に私達の循環をターゲットにすることができますので、フィールドオブジェクトのフィールド名を取得
してから、私はこの分野では、この辞書オブジェクトを持っている、と言うことを意味し、GETATTRにより、フィールド名の値を削除することができます名前
私は、この値はフィールド名から取り出されたい


今、我々はすべてのフィールドの名前を取得する必要があり、彼らは=フィールド名にスプライスされるのですか?これは、直接私の定義された変数に
スプライシングされたことはできません。ほんの少し後でトラブルに
もフィールド名のすべての値を取得するには、放射線を必要と
し、最終的に我々は、SQL文を継ぐ
方法はMySQLのSQL文で実行呼び出したデータ変更


9を、私たちは、MySQLを呼び出すオブジェクトのインスタンスを作成する必要があり
、その後、まだ3を定義する必要がありますフィールドの名前、およびフィールドの一致を保持する変数?数、フィールドの値がある
か、最初のマッピングの辞書循環は、主キーフィールドを削除するには、ここでは、なぜ、主キーが増加している、主キーをされないのでなければならないことに注意してください、PRIMARY_KEYではありません
指定された人間を取るために私たちを必要とせず、
右これらのフィールドの名前がリストに追加取得、
だけでなく、疑問符を一致させるために、中リストに別の追加
方法を反映するために、最後の名前フィールドのフィールド名の値を、またリストに追加
我々は、この時点でれるSQL文はステッチ
ここに反映さは、私たちが作成してもらうことです 
テーブルクラスインスタンス化されたオブジェクトを、我々はそれがキーワード引数を渡す与えています
その後、オブジェクトだけでなく、辞書オブジェクト、上記理由をインスタンス化し、反射法を変更することと同じです。
同じ、データオブジェクトを変更しないで、我々はそれがのインスタンス与えたデータを取得することで
、私たち自身の質量の参加、対象の自分の本当の列を増加させたデータを
そのオブジェクトが辞書オブジェクトである
ので、我々はできるが私たちは今、ゾディ辞書オブジェクトの符号フィールドということである。このフィールドの値が対応する取得するGETATTR、はっきり、
私たちはこのプロパティを介して、今あるが、次の値を取得することができます
"「」を

 第二部

輸入pymysql 


#创建一个数据库类の
クラスのMySql(オブジェクト): 定义一个变量
    _INSTANCE =なし

    デフ__init __(自己):
        self.conn = pymysql.connect(
            ホスト= "127.0.0.1"、
            ポート= 3306、
            ユーザー= "ルート」、
            パスワード= "00"、
            データベース= "DB"、
            文字セット= "UTF8"、
            自動コミット=真
        self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)

    デフdb_close(自己):
        self.cursor。クローズ()
        self.conn.close()
のSQL文の実行を、そして見つけるために、内容を返し
    デフ(自己、SQL、argsを選択 =なし):
        self.cursor.execute(SQL、引数)
        RES = self.cursor.fetchall() 
        復帰RES 

    #のSQL文の実行
    DEF(セルフ、SQL、引数)を実行します。
        試してみてください。
            self.cursor.execute(SQL、引数)
        BaseException除くE AS:
            印刷(E) シングルモード
    @classmethod 
    DEFシングルトン(CLS): ない値は可変でない場合
        cls._instanceていない場合:
            #クラスブラケットは、オブジェクトのインスタンスを作成し、変数_INSTANCE用に割り当て
            =()cls._instanceのCLS 
        直接リターンがある場合#オブジェクト
        戻りcls._instance

 

おすすめ

転載: www.cnblogs.com/cherish937426/p/11366003.html