ホームページ  >  記事  >  バックエンド開発  >  Python での SQLAlchemy の簡単な紹介

Python での SQLAlchemy の簡単な紹介

不言
不言転載
2018-10-23 16:44:242771ブラウズ
この記事では、PHP シナジー実装の詳細な説明 (コード付き) を提供します。一定の参考価値があります。必要な友人は参照してください。お役に立てば幸いです。

SQLAlchemy は、Python プログラミング言語によるオープン ソース ソフトウェアです。 SQL ツールキットとオブジェクト リレーショナル マッピング (ORM) ツールを提供する SQLAlchemy は、MIT ライセンスの下でリリースされています。シンプルな Python 言語を使用して完全なエンタープライズ グレードの永続性モデルを実装し、効率的で高パフォーマンスのデータベース アクセスを実現するように設計されています。 SQLAlchemy はデータベースのサイズとパフォーマンスに細心の注意を払っています。

このセクションでは、一連の例を通じて SQLAlchemy の使用法を分析します。

SQLAlchemy を使用するには、テーブルの定義、データベース接続の定義、追加、削除、変更、クエリなどの論理操作の実行というコードの少なくとも 3 つの部分が必要です。

テーブル定義の例:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String
Base=declarative_base()
class Accout(Base):
    __tablename__=u'accout'
    id=Column(Integer,primary_key=True)
    user_namr=Column(String(50),nullable=False)
    password=Column(String(200),nullable=False)
    title=Column(String(50))
    salary=Column(Integer)

    def is_active(self):
        #假设所有
        return True

    def get_id(self):
        #返回账号ID,用方法返回属性值提高了表的封装性。
        return self.id

    def is_authenticated(self):
        #假设已经通过验证
        return True

    def is_anonymous(self):
        #具有登陆名和密码的账号不是匿名用户
        return False

定義テーブルを解析するコードは次のとおりです:

  • SQLAlchemy は次のとおりです。 SQLAlchemy テーブル .ext.declarative_base の前に導入され、そのインスタンス Base を定義します。すべてのテーブルは Base から継承する必要があります。この例では、アカウント テーブル クラス Account が定義されています。

  • データベース内のテーブルの実際の名前アカウントは、__tablename__ 属性によって定義されます。

  • テーブル内の列を定義するために使用する必要があるため、sqlalchemy パッケージに Column、Integer、および String 型を導入します。この例では、Account テーブルに 5 つの列、つまり整数の id と給与、および文字列型の user_name、password、および title を定義します。

  • 列を定義するとき、パラメータを Column に渡すことで制約を定義できます。この例では、id 列は、primary_key パラメーターを通じて主キーとして定義され、user__name とpassword は、nullable パラメーターを通じて非 null として定義されます。

  • #テーブル内の他の関数をカスタマイズすることもできます。この例では、ユーザー認証で一般的に使用されるいくつかの関数、is__activite()、get__id()、is__authenticate()、および is_anonymous() を定義します。

データベース接続を定義するサンプル コードは次のとおりです。

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session,sessionmaker
from contextlib import contextmanager

db_connect_string='mysql://v_user:v_pase@localhost:3306/test_database?charset=utf8'

ssl_args={
    'ssl':{
        'cert':'/home/ssl/client-cert.pem',
        'key':'/home/shouse/ssl/client-key.pem',
        'ca':'/home/shouse/ssl/ca-cert.pem'
    }
}
engine=create_engine(db_connect_string,connect_args=ssl_args)
SessionType=scoped_session(sessionmaker(bind=engine,expire_on_commit=False))
def GetSession():
    return SessionType()

@contextmanager
def session_scope():
    session=GetSession()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()
この接続のデータ部分を解析するコードは次のとおりです。 :

  • データベース エンジンとセッション エンジンの紹介: sqlalchemy.create_

    engine、sqlalchemy.orm.scoped_session、sqlalchemy.orm.sessionmaker。

  • データベースへの接続に必要なデータベース文字列を定義します。この例では、MySQL データベースが接続されており、文字列形式は [databse_

    type]://[user_name]:[password]@[domain]:[port]/[database]?[parameters] です。 ]。この例では、必要な接続情報に加えて、データベース内の文字列をデコードするための UTF-8 エンコード方式を指定する charset パラメータも渡されます。

  • create_engine を使用してデータベース エンジンを作成します。データベースで SSL リンクが有効になっている場合は、ここで SSL クライアント証明書のファイル パスを渡す必要があります。

  • scoped_session(sessionmaker(bind=engine)) を使用してセッション タイプ SessionType を作成し、関数 GetSession() を定義して SessionType のインスタンスを作成します。

この時点で、GetSession() 関数を使用してデータベース セッションを作成し、データベース操作を実行できます。ただし、後続のデータベース オペレーション コードがトランザクション処理を自動的に実行できるようにするために、この例ではコンテキスト関数 session_scope() が定義されています。 Python でコンテキスト関数を定義する方法は、contextlib パッケージに contextmanager デコレーターを追加することです。次のロジックがコンテキスト関数で実行されます: 関数の開始時にデータベース セッションが確立され、この時点でデータベース トランザクションが自動的に確立されます: 例外が発生するとトランザクションはロールバックされ、終了すると接続が閉じられます。トランザクションのコミット操作は、接続が閉じられると自動的に実行されます。

データベース操作のコード:

from sqlalchemy import or_,orm
def InsertAccount(user,passwd,title,salary): #新增操作
    with session_scope() as session:
        account=orm.Account(user_name=user,passwd=passwd,title=title,salary=salary)
        session.add(account)

def GetAccount(id=None,user_name=None): #查询操作
    with session_scope() as session:
        return session.query(orm.Account).filter(
            or_(orm.Account.id==id,orm.Account.user_name=user_name)
        ).first()

def DeleteAccount(user_name): #删除操作
    with session_scope() as session:
        account=GetAccount(user_name=user_name)
        if account:
            session.delete(account)

def UpdateAccount(id,user_name,password,title,salary):  #更新操作
    with session_scope() as session:
        account=session.query(orm.Account).filter(orm.Account.id==id).first()
        if not account:return
        account.user_name=user_name
        account.password=password
        account.salary=salary
        account.title=title


InsertAccount("Mark","123","Manager",3000)  #调用新增操作
InsertAccount("帅哥","456","Boss",2000)  #调用新增操作
GetAccount(2) #调用查询操作
DeleteAccount("Mark")
UpdateAccount(1,"admin","none","System admin",2500)
この例では、データベースで最も一般的に使用される 4 つのレコードベースの操作 (追加、検索、削除、更新) を示します。コードのこの部分の分析は次のとおりです。

  • import ステートメントを使用して、データ テーブル (アカウント) が配置されているパッケージ orm を導入します。複数条件クエリを導入する場合は or_ を使用します。

  • 各関数では、コンテキスト関数 session_scope() が wi​​th ステートメントを通じて有効になり、これを通じてセッション オブジェクトが取得され、新しい処理が自動的に開始されます。

  • InsertAccount で、新しいテーブル Account インスタンスを作成し、session.add を通じてデータベースに追加します。コンテキスト関数が終了するとトランザクションは自動的にコミットされるため、新しい追加を有効にするために明示的に session.commit() を呼び出す必要はありません。

  • クエリは GetAccount のクエリ ステートメントによって実行されます。クエリ条件はフィルタによって設定されます。複数のクエリ条件は or__

    または and__ を使用して接続できます。

  • DeleteAccount の GetAccount を通じてオブジェクトをクエリします。見つかった場合は、session.delete() を直接呼び出してオブジェクトを削除します。

  • InsertAccount() で、クエリを通じて ID に従ってレコードをクエリします。クエリが見つかった場合は、オブジェクトのプロパティを設定してレコードを変更します。

  • クエリ ステートメントの結果は、オブジェクトのコレクションです。クエリ ステートメントの後の first() 関数は、コレクション内の最初のオブジェクトを抽出するために使用されます。first() 関数を all() 関数に置き換えると、クエリはコレクションを返します。

主流データベースの接続方法

SQLAlchemy などの Orm データベース操作方法は、ビジネス開発者を異なるデータベース間の違いから守ることができます。データベースの移行が必要な場合 (MySQL から SQLite など)、データベース接続文字列を変更するだけで済みます。

次の表は、SQLAlchemy が主流のデータベースに接続する場合のデータベース文字列の書き込みメソッドを示しています。
データベースパッケージ 连接字符列
Microsoft SQLServer 'mssql pymssql://[ユーザー]:[パス]@[ドメイン]:[ポート]/[データベース名]'
MySQL 'mysql://[ユーザー] ]:[パス]@[ドメイン]:[ポート]/[データベース名]'
Oracle 'oracle://[ユーザー]:[パス]@ [ドメイン]:[ポート/[データベース名]]'
PostgreSQL 'postgresql://[ユーザー]:[パス]@[ドメイン]:[ポート]/[dbname]'
SQLite 'sqlite://[file_pathname]'

##

以上がPython での SQLAlchemy の簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。