ホームページ >バックエンド開発 >Python チュートリアル >Python Webサイト開発でどのORMフレームワークが使用されるかを詳しく説明した記事

Python Webサイト開発でどのORMフレームワークが使用されるかを詳しく説明した記事

Tomorin
Tomorinオリジナル
2018-08-23 17:47:211530ブラウズ

前回の記事では、Python に関する知識を多少なりとも紹介しましたが、実際の戦闘では Python 開発ページ を使用する必要があります。フレームワーク開発ページ が最もシンプルで簡単です。この章では、Python ページ開発orm フレームワーク を使用したページの開発について紹介します。

ORM とは

##ORM

つまり オブジェクト リレーショナル マッピング、正式名はオブジェクト リレーショナル マッピングです。 しかし、それは何をするのでしょうか?

Web バックグラウンドの最適化を経験したことがある方は、Web バックグラウンドでの作業の大部分がデータの追加、削除、変更、クエリであることがわかります。データベースに接続する必要がある場合は、データベースを操作するたびにsql文を実行してしまうのは仕方がありませんが、面倒なのでデータベース内のテーブル、フィールド、行とクラスとの間に1対1のマッピング関係を確立し、オブジェクト指向プログラミングではクラス属性とオブジェクトを使用するため、データベースを直接操作する必要がなく、対応するメソッドを呼び出すだけです。

私が過去に行ったことを例に挙げると理解できると思います。たとえば、ユーザー登録を実装する場合、以前はフロントデスクがデータを取得してバックエンドに渡し、その後バックエンドに渡しました。バックグラウンド文字列が結合されて SQL ステートメントが形成され、バックグラウンドで実行されました。
#ORM
を使用すると、データを含む User オブジェクトをインスタンス化し、そのオブジェクトの save メソッドを呼び出してデータベースに保存するだけで済みます。ユーザーとして操作する必要はありません。 SQL ステートメントのステートメント。
User クラスが users テーブルに対応していると仮定します

user=User(id="100001",name="Andy",password="*****")
user.save()  //保存到数据库
user=User.findById("100001") #从数据库中找出id为"100001"的用户
user.update(password="*********")  #更改id为"100001"的用户密码
users=User.findAll() #取出users表中全部数据
質問したのですが、このように使うと快適ではないでしょうか?

IO 操作はすべて非同期であり、使用される非同期ライブラリは asyncio です。リンクされたデータベースは mysql 5.7 です。 mysql 非同期 IO ドライバーは、aiomysql の ORM を実装するために必要な準備です


#---データベース操作のカプセル化

Createデータベース接続プール

import asyncioimport aiomysql       
async def create_pool(**kw):global __pool
__pool=await aiomysql.create_pool(
    host=kw.get('host','localhost'),
    port=kw.get('port',3306),
    user=kw['user'],
    password=kw['password'],
    db=kw['db'],
    charset=kw.get('charset','utf8'),
    autocommit=kw.get('autocommit',True), # 自动提交事务
    maxsize=kw.get('maxsize',10),  # 池中最多有10个链接对象
    minsize=kw.get('minsize',1),
)
クエリの内容を返す select メソッドに加えて、select メソッドをカプセル化します。 、残りの更新。挿入と削除の両方で、影響を受ける行の数を返すだけでよいため、それら 3 つを 1 つの実行メソッドにカプセル化できます

async def select(sql,args,size=None): //size可以决定取几条
global __pool
with (await __pool) as conn:
    cur=await conn.cursor(aiomysql.DictCursor) 
    # 用参数替换而非字符串拼接可以防止sql注入
    await cur.execute(sql.replace('?','%s'),args)  
    if size:
        rs=await cur.fetchmany(size) 
    else:
        rs=await cur.fetchall()  
    await cur.close()
    return rs

ORM の実装を開始します。

プログラミングには「トップダウン」と呼ばれる考え方があります。したがって、

ORM

の設計方法がわからない場合は、ORM フレームワークがすでに存在すると仮定して、それをどのように使用したいのでしょうか?

def execute(sql,args):
global __pool
try:    
    with (await __pool) as conn:
      cur=await conn.cursor()        
         await cur.execute(sql.replace('?', '%s'), args)
      affected=cur.rowcount
         await cur.close()
except BaseException as e:
    raise e
return affected
このように User クラスを見ると、それが user テーブルに対応していることが非常に明確であり、このテーブルにどのようなフィールドがあるのか​​が一目瞭然であることに気づきましたか。次に、サブクラスに親クラスを継承させて、find、save... などのメソッドの再利用を実現します。それは完璧ですが、どうやってそれを達成するのでしょうか?

字段类的实现

class Field(object):
  def __init__(self,name,column_type,primary_key,default):  
     self.name=name # 字段名
    self.column_type=column_type # 字段数据类型
    self.primary_key=primary_key  # 是否是主键
    self.default=default  # 有无默认值
  def __str__(self):  
     return &#39;<%s:%s>&#39; % (self.__class__.__name__,self.name)  
   class StringField(Field):
    def __init__(self,name=None,primary_key=False,default=None,ddl=&#39;varchar(100)&#39;): 
      super(StringField,self).__init__(name,ddl,primary_key,default)
  # 其它字段略,一个道理,一个模式


以上がPython Webサイト開発でどのORMフレームワークが使用されるかを詳しく説明した記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。