目次
背景
初期化作業
個人的なデザイン
マッピング ステートメント (モデルの紹介)
セッションの紹介
ホームページ バックエンド開発 Python チュートリアル SQL を使用するための非常に便利な Python アーティファクトです。

SQL を使用するための非常に便利な Python アーティファクトです。

Apr 18, 2023 pm 04:19 PM
python sql

SQL を使用するための非常に便利な Python アーティファクトです。

背景

実は最初はpymysqlを使っていたのですが、メンテナンスが面倒でコードインジェクションのリスクもあったため、単純にORMを使っていました。フレームワークを直接。

ORMとはObject Relational Mapperのことで、簡単に言うとデータベースのテーブルとPythonのクラスとのマッピングであり、Pythonのクラスを操作することで間接的にデータベースを操作することができます。

より有名な Python ORM フレームワークは、SQLAlchemy と Peewee です。ここでは比較はしませんが、SQLAlchemy の個人的な使用法について簡単に説明します。友人全員の役に立つことを願っています。

  • sqlalchemy バージョン: 1.3.15
  • pymysql バージョン: 0.9.3
  • mysql バージョン: 5.7

初期化作業

一般に、ORM フレームワークを使用する場合、データベース接続、基本的なマッピングの定義など、いくつかの初期化作業が必要になります。

MySQL を例に挙げると、データベース接続を作成するには、DSN 文字列を渡すだけで済みます。エコーは、対応する SQL ステートメントを出力するかどうかを示し、デバッグに役立ちます。

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://$user:$password@$host:$port/$db?charset=utf8mb4', echo=True)
ログイン後にコピー

個人的なデザイン

私個人としては、ORM フレームワークを導入するときに、私のプロジェクトでは次のデザインの MVC パターンを参照します。このうち、model にはいくつかのデータベース モデル、つまりデータベース テーブルにマッピングされた Python クラスが格納され、model_op には各モデルに対応する操作 (追加、削除、確認、変更) が格納され、呼び出し元 (main.py など) が実行されるときに、データベース操作を実行する場合、model_op 層を呼び出すだけで済みます。分離を実現するためにモデル層を気にする必要はありません。

├── main.py
├── model
│ ├── __init__.py
│ ├── base_model.py
│ ├── ddl.sql
│ └── py_orm_model.py
└── model_op
├── __init__.py
└── py_orm_model_op.py
ログイン後にコピー

マッピング ステートメント (モデルの紹介)

たとえば、このようなテスト テーブルがあるとします。

create table py_orm (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '唯一id',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称',
`attr` JSON NOT NULL COMMENT '属性',
`ct` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`ut` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON update CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY(`id`)
)ENGINE=InnoDB COMMENT '测试表';
ログイン後にコピー

ORM フレームワークでは、マッピング結果は以下の Python クラスになります。

# py_orm_model.py
from .base_model import Base
from sqlalchemy import Column, Integer, String, TIMESTAMP, text, JSON
class PyOrmModel(Base):
__tablename__ = 'py_orm'
id = Column(Integer, autoincrement=True, primary_key=True, comment='唯一id')
name = Column(String(255), nullable=False, default='', comment='名称')
attr = Column(JSON, nullable=False, comment='属性')
ct = Column(TIMESTAMP, nullable=False, server_default=text('CURRENT_TIMESTAMP'), comment='创建时间')
ut = Column(TIMESTAMP, nullable=False, server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), comment='更新时间')
ログイン後にコピー

まず第一に、PyOrmModel が Base クラスを継承していることがわかります。これは、sqlalchemy によって提供される基本クラスです。これは、宣言した Python クラスに対していくつかのチェックを実行し、それをbase_model に置きます。

# base_model.py
# 一般base_model做的都是一些初始化的工作
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:33306/orm_test?charset=utf8mb4", echo=False)
ログイン後にコピー

第二に、各 Python クラスには __tablename__ 属性が含まれている必要があります。そうでないと、対応するテーブルが見つかりません。

3 番目に、データ テーブルを作成するには 2 つの方法があります。1 つ目は、MySQL で手動で作成する方法です。Python クラスの定義に問題がない限り、正常に動作します。2 つ目は、MySQL で手動で作成する方法です。以下のような ORM Frame 作成を使用することです。

# main.py
# 注意这里的导入路径,Base创建表时会寻找继承它的子类,如果路径不对,则无法创建成功
from sqlachlemy_lab import Base, engine
if __name__ == '__main__':
Base.metadata.create_all(engine)
ログイン後にコピー

作成効果:

...
2020-04-04 10:12:53,974 INFO sqlalchemy.engine.base.Engine
CREATE TABLE py_orm (
id INTEGER NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL DEFAULT '' COMMENT '名称',
attr JSON NOT NULL COMMENT '属性',
ct TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
ut TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
)
ログイン後にコピー

4 番目、フィールド属性について:

1.primary_key と autoincrement は理解しやすいです。これらは MySQL の主キーと増分属性です。

2. int 型の場合は長さを指定する必要はありませんが、varchar 型の場合は長さを指定する必要があります。

3.nullable は、MySQL の NULL と NOT NULL に対応します。

4.default と server_default について:default は、ORM フレームワーク レベルでのデフォルト値を表します。つまり、フィールドが挿入される場合に、 Inserting 値が割り当てられていない場合は、定義したデフォルト値が使用されます。server_default はデータベース レベルのデフォルト値を表し、これは DDL ステートメントのデフォルトのキーワードです。

セッションの紹介

SQLAlchemy ドキュメントには、データベースの追加、削除、変更がセッションを通じて実行されると記載されています。

>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)
>>> session = Session()
>>> orm = PyOrmModel(id=1, name='test', attr={})
>>> session.add(orm)
>>> session.commit()
>>> session.close()
ログイン後にコピー

上記のように、操作ごとにセッションを取得、送信、解放する必要があることがわかります。これは冗長で面倒なので、通常はカプセル化の層を実行します。

1. コンテキスト マネージャーを使用して、セッションの異常なロールバックと終了を処理します。この部分は参照記事とほぼ一致しています。

# base_model.py
from contextlib import contextmanager
from sqlalchemy.orm import sessionmaker, scoped_session
def _get_session():
"""获取session"""
return scoped_session(sessionmaker(bind=engine, expire_on_commit=False))()
# 在这里对session进行统一管理,包括获取,提交,回滚和关闭
@contextmanager
def db_session(commit=True):
session = _get_session()
try:
yield session
if commit:
session.commit()
except Exception as e:
session.rollback()
raise e
finally:
if session:
session.close()
ログイン後にコピー

2.モデルと辞書間の変換のために 2 つのメソッドを PyOrmModel に追加します。

class PyOrmModel(Base):
...
@staticmethod
def fields():
return ['id', 'name', 'attr']
@staticmethod
def to_json(model):
fields = PyOrmModel.fields()
json_data = {}
for field in fields:
json_data[field] = model.__getattribute__(field)
return json_data
@staticmethod
def from_json(data: dict):
fields = PyOrmModel.fields()
model = PyOrmModel()
for field in fields:
if field in data:
model.__setattr__(field, data[field])
return model
ログイン後にコピー

3. データベース操作のカプセル化 参考記事とは異なり、セッションを直接呼び出したので、呼び出し側がモデル層を意識する必要がなく、結合が軽減されます。

# py_orm_model_op.py
from sqlachlemy_lab.model import db_session
from sqlachlemy_lab.model import PyOrmModel
class PyOrmModelOp:
def __init__(self):
pass
@staticmethod
def save_data(data: dict):
with db_session() as session:
model = PyOrmModel.from_json(data)
session.add(model)
# 查询操作,不需要commit
@staticmethod
def query_data(pid: int):
data_list = []
with db_session(commit=False) as session:
data = session.query(PyOrmModel).filter(PyOrmModel.id == pid)
for d in data:
data_list.append(PyOrmModel.to_json(d))
return data_list
ログイン後にコピー

4.発信者:

# main.py
from sqlachlemy_lab.model_op import PyOrmModelOp
if __name__ == '__main__':
PyOrmModelOp.save_data({'id': 1, 'name': 'test', 'attr': {}})
ログイン後にコピー

以上がSQL を使用するための非常に便利な Python アーティファクトです。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPythonの選択:ガイド PHPとPythonの選択:ガイド Apr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

Sublime Code Pythonを実行する方法 Sublime Code Pythonを実行する方法 Apr 16, 2025 am 08:48 AM

PythonコードをSublimeテキストで実行するには、最初にPythonプラグインをインストールし、次に.pyファイルを作成してコードを書き込み、Ctrl Bを押してコードを実行する必要があります。コードを実行すると、出力がコンソールに表示されます。

PHPとPython:彼らの歴史を深く掘り下げます PHPとPython:彼らの歴史を深く掘り下げます Apr 18, 2025 am 12:25 AM

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

Golang vs. Python:パフォーマンスとスケーラビリティ Golang vs. Python:パフォーマンスとスケーラビリティ Apr 19, 2025 am 12:18 AM

Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

メモ帳でPythonを実行する方法 メモ帳でPythonを実行する方法 Apr 16, 2025 pm 07:33 PM

メモ帳でPythonコードを実行するには、Python実行可能ファイルとNPPEXECプラグインをインストールする必要があります。 Pythonをインストールしてパスを追加した後、nppexecプラグインでコマンド「python」とパラメーター "{current_directory} {file_name}"を構成して、メモ帳のショートカットキー「F6」を介してPythonコードを実行します。

Golang vs. Python:重要な違​​いと類似点 Golang vs. Python:重要な違​​いと類似点 Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

See all articles