sqlalchemy に基づいて MySQL で追加、削除、変更、クエリ操作を実装する

sqlalchemy に基づいて MySQL で追加、削除、変更、クエリ操作を実装する

需要シナリオ:

上司は、クロ​​ーラーを使用してMySQLデータベースにデータを書き込んだり更新したりするように私に依頼しました。Baiduは2つの方法を見つけました

1 は、pymysql を使用して mysql に接続し、ネイティブの sql ステートメントを操作してデータを追加、削除、変更、および照会することです。

2 は、ネイティブ SQL ステートメントを記述せずに、sqlalchemy を使用して mysql に接続し、テーブルを構築し、ORM モデルを通じてデータベースを操作することです。これは比較的簡単です。

以下は sqlalchemy を使用した私の経験です。

実装プロセス: データベースに接続 > モデルクラスを介してテーブルを作成 > セッションを確立 > テーブル作成ステートメントを実行 > セッションを介して追加、削除、変更、クエリを実行

sqlalchemy からインポート、存在する、列、整数、文字列、外部キー、存在する
sqlalchemy.ext.declarative から declarative_base をインポートします
sqlalchemyからcreate_engineをインポート
sqlalchemy.ormからsessionmakerをインポート

# データベースエンジンを作成しました engine = create_engine("mysql+pymysql://user:pwd@ip/database name?charset=utf8")

#セッションタイプを作成 DBSession = sessionmaker(bind=engine)

# 公式モデルをインスタンス化します - Base は ORM モデルです Base = declarative_base()


# サービス注文テーブルを作成する class ServiceOrder(Base):
  __tablename__ = 'サービスオーダーテーブル'
  id = 列(整数、主キー=True、自動増分=True)
  serviceOrderId = Column(String(32), nullable=False, index=True, comment='サービス注文ID')
  serviceDesc = Column(String(268), comment='サービスの説明')
  oneLevelName = 列(文字列(32)、コメント='C カテゴリ')
  twoLevelName = Column(String(32), コメント='T サブクラス')
  threeLevelName = Column(String(32), comment='I プロジェクト')
  fourLevelName = Column(String(32), comment='S サブ項目')
  transferTimes = Column(String(32), comment='転送回数')
  overDueStatus = Column(String(32), comment='期限切れステータス')
  serviceTimeLimit = Column(String(32), comment='サービス時間制限')
  serTimeLimitTypeName = Column(String(16), comment='時間制限タイプ')  
  # 1対多:
  # serviceWorkOrder = relationship("ServiceWorkOrder", backref="serviceorder")


# 多対一: 複数のサービス オーダーがサービス オーダー クラス ServiceWorkOrder(Base) に属することができます。
  __tablename__ = 'サービス作業注文テーブル'
  id = 列(整数、主キー=True、自動増分=True)
  serviceWorkOrderId = Column(String(32), nullable=False, index=True, comment='サービス作業注文ID')
  workOrderName = Column(String(268), comment='作業指示書名')
  fromId = Column(String(32), comment='サービス注文ID')
  createUserSectionName = Column(String(32), comment='ユーザーセクションの作成')
  createUserName = 列(文字列(32)、コメント='作成者')
  handlerName = Column(String(32), comment='Handler')
  statusName = Column(String(32), comment='作業指示書のステータス')
  createTime = Column(String(32), comment='作成時刻') 
  # 「多」側の book テーブルは、外部キーを介して user テーブルにリンクされています。
  # serviceOrder_id = 列(整数、外部キー('serviceOrderTable.id'))

# データベースを作成します。データベースがすでに存在する場合は作成されません。ライブラリ名に従って既存のライブラリに直接接続します。def init_db():
  Base.metadata.create_all(エンジン)

drop_db() を定義します:
  Base.metadata.drop_all(エンジン)

デフ挿入更新():
  # all_needed_data_lists は、データベースに挿入する必要があるデータ形式です [{key: value, ... }, { }, { }...]
  all_needed_data_lists 内の項目の場合:
    ServiceOrderRow = ServiceOrder(serviceOrderId=item['serviceOrderId'],
                    サービス説明=item['サービス説明'],
                    ワンレベル名=アイテム['ワンレベル名'],
                    twoLevelName=アイテム['twoLevelName'],
                    threeLevelName=アイテム['threeLevelName'],
                    fourLevelName=アイテム['fourLevelName'],
                    転送時間=item['転送時間'],
                    期限超過ステータス=item['期限超過ステータス'],
                    サービス時間制限=item['サービス時間制限'],
                    serTimeLimitTypeName=item['serTimeLimitTypeName'],
                    )
    試す:
      # exists を使用して、ターゲットオブジェクトが存在するかどうかを判断し、True または Faults を返します。
      it_exists = セッション.クエリ(
          存在する()。ServiceOrder.serviceOrderId == item['serviceOrderId'] )
        )。スカラー()
    except 例外を e として:
      自己ログエラー(e)
      壊す
    試す:
      # 存在しない場合は追加します。存在する場合は、既存のデータを更新します。存在しない場合は it_exists:
        セッション.add(サービスオーダー行)
      それ以外:
        session.query(ServiceOrder).filter(ServiceOrder.serviceOrderId == item['serviceOrderId'])\
          .update(アイテム)
    except 例外を e として:
      自己ログエラー(e)
      壊す
  試す:
    セッションコミット()
    self.log.info('データが正常に更新されました!')
  を除外する:
    セッション.ロールバック()
    self.log.info('データの更新に失敗しました!')

__name__ == "__main__" の場合:
  # データベースを作成します。データベースがすでに存在する場合は作成されません。ライブラリ名に従って既存のライブラリに直接接続します。init_db()
  # 追加、削除、変更、クエリを実行するためのセッション オブジェクトを作成します。
  セッション = DBSession()
  # セッションを使用してデータを追加または変更します。 insert_update() を送信することを忘れないでください。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • SQLAlchemyを使用してデータベーステーブルプロセス分析を操作する
  • Python sqlalchemy タイムスタンプとパスワード管理コードの詳細な説明
  • Python SQLAlchemyで更新のための選択を実装する方法
  • Python SQLAlchemyライブラリの使い方
  • Python の人気 ORM フレームワーク sqlalchemy の簡単な使用
  • Python での sqlalchemy の使用の概要
  • Python ORM フレームワーク SQLAlchemy の基本的な使い方
  • PythonのSQLAlchemyはフロントエンドページを使用してデータを挿入します

<<:  webpack -v エラー解決

>>:  Vue echarts は水平棒グラフを実現します

推薦する

流れと動的なライン効果を実現する純粋なCSSコード

アイデア:外側のボックスは背景を設定し、内側のボックスは背景の幅と高さを設定し、ボックスを動かすアニ...

Windows環境でのMySQL 8.0.13無料インストールバージョンの設定チュートリアル

目次圧縮ファイルをダウンロードするアドレス: https://dev.mysql.com/downl...

MySQL 接続例外とエラー 10061 の解決方法

MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレーショナル データベース...

Nodejs での WeChat アプレット メッセージ プッシュの実装

サブスクリプションメッセージテンプレートを選択または作成するWeChat アプレットにログインし、「...

レスポンシブ原則をシミュレートするための基礎コードの Vue 実装の例

目次1.Vue.js の機能: 2.Observer.js 関数 (データハイジャック): 3. C...

Vue3 の SetUp 関数のプロパティとコンテキスト パラメータの詳細な説明

1. setUp関数の最初のパラメータpropsセットアップ(プロパティ、コンテキスト){}最初のパ...

Docker Compose を使用して ELK を迅速にデプロイする (テスト済みで効果的)

目次1. 概要1.1 定義1.2 機能説明2. ELKを展開する2.1 ディレクトリとファイルを作成...

Dockerを使用してクローンリポジトリを使用してGitイメージを構築する

概要私は 1 年以上 Docker を使用しています。最近、サービスをすばやくオーケストレーションし...

複雑なウェブサイトのナビゲーションを簡素化

<br />ナビゲーション設計は構造設計における主要なタスクの 1 つです。ソフトウェア...

MySQL テーブルの追加、削除、変更、クエリの基本チュートリアル

1. 作成する [テーブル名] (フィールド1、フィールド2、...) 値 (値1、値2、...) ...

MySQLはSQL文を使用してテーブル名を変更します

MySQL では、SQL ステートメント rename table を使用してテーブル名を変更できま...

Linux システム AutoFs 自動マウント サービスのインストールと構成

目次序文1. サービスプログラムをインストールする2. メイン設定ファイルを書く3. サブ構成ファイ...

純粋な CSS でマークダウンの自動番号付けを実装するサンプル コード

問題の起源私がタイトルの番号付けの問題に初めて注目したのは、学部の論文を書いていた頃まで遡ります。当...

MySQL5.7 並列レプリケーションの原理と実装

データ操作とメンテナンスに少しでも知識のある人なら、MySQL 5.5 以前では再生に単一の SQL...

オンラインチャットを実現するVue+sshフレームワーク

この記事では、オンラインチャットを実現するためのVue + sshフレームワークの具体的なコードを参...