手を取って教えます。Djangoで原生SQLの方法を実行します。

4784 ワード

前言
Hey、子供の皆さん、今度はどうやって遊びに来ますか?Djangoを使って原生SQLを実行しますか?
私達はすべて知っていて、Pythonはweb界ので取っ手を担います――Django、集大成して統一になることができて、各種のプラグイン、formsのコンポーネント、model模型、Adminバックグランドなど、後で私は専門的に文章を出して弁舌さわやかに言うことができて、どのみち1つの字で、NB。
今回は、Djangoで原生語句をどうやって実行するかを学びます。
起因
Djangoを使う時、私達はDjangoの持参したmodelを使って検索するのは問題がなくて、80%の問題を満たすことができます。
でも、でも、20%はいらないですか?きっとだめですよ。子供は選択をします。
Djangoで原生SQLを実行するには、以下の3つの方法があります。
  • extra
  • raw
  • django connection
  • 一般的には、上記の3つの方法について
    テーブル構造
    ファイル:djangoproject/ap 01/models
    
    class Book(models.Model): 
      title = models.CharField(verbose_name="  ", max_length=32) 
      describe = models.TextField(verbose_name="  ") 
      author = models.CharField(verbose_name="  ", max_length=32) 
      publisher = models.CharField(verbose_name="   ", max_length=32) 
      publisher_date = models.DateField(verbose_name="publisher") 
    簡単な図書表です。
    adminを通していくつかのデータを入力してテストして使います。

    extra方式
    強く提案します。勉強しなくても大丈夫です。役に立たないです。
    raw方式
    これはextraと比較して有用です。
    文法は以下の通りです
    
    models.  .objecs.raw(sql) 
    models.  .objecs.raw(sql,[  1,  2]) 
    注:パラメータがない場合は、sql文だけを書きます。パラメータによっては、後でリストを使います。
    例を引く

    まだ一つ一つのBookオブジェクトを返します。
    本当の元の生き方
    上記のように、実はdjangoのモデルと少し紐付けしています。しかし、私はつまり、原生sqlがほしいです。何のバインディングもしないでください。
    ここで言ってください。djangoでpymysqlを使って原生sqlを実行しないでください。変な問題が発生します。from django.db import connectionを導入してsqlを実行します。コードは以下の通りです
    
    from django.db import connection 
    def book_list(request): 
      #      sql, 
      cursor = connection.cursor() 
      print(type(cursor)) 
      cursor.execute("select * from app01_book where id=%s", [1, ]) 
      raw = cursor.fetchall() 
      print(raw) 
    戻り内容は下図のようになります。

    戻ってきたのはリストの中にセットされた行列です。調べたsqlをそのまま辞書に戻す方法があるかと思っています。答えはもちろんいいです。
    原生sqlを実行してdictに戻ります。
    私は原生sqlを実行して直接辞書に戻す方式を二つの関数にカプセル化しました。
    一つは複数のクエリーで、コードは以下の通りです。
    
    def query_all_dict(sql, params=None): 
      ''' 
                     
      :param sql: 
      :param params: 
      :return: 
      ''' 
      with connection.cursor() as cursor: 
        if params: 
          cursor.execute(sql, params=params) 
        else: 
          cursor.execute(sql) 
        col_names = [desc[0] for desc in cursor.description] 
        row = cursor.fetchall() 
        rowList = [] 
        for list in row: 
          tMap = dict(zip(col_names, list)) 
          rowList.append(tMap) 
        return rowList 
    一つはクエリーです。コードは以下の通りです。
    
    def query_one_dict(sql, params=None): 
      """ 
                     
      :param sql: 
      :param params: 
      :return: 
      """ 
      with connection.cursor() as cursor: 
        if params: 
          cursor.execute(sql, params=params) 
        else: 
          cursor.execute(sql) 
        col_names = [desc[0] for desc in cursor.description] 
        row = cursor.fetchone() 
        tMap = dict(zip(col_names, row)) 
        return tMap 
    使用法は以下の通りです。直接にビューで関数を呼び出します。

    返ってきた結果は、直接リストセットの辞書形式です。

    条件付きはどうすればいいですか?実はpymysqlと同じです。

    結果を返します

    しかし、問題があります。上の調査は、一つの値しか返ってこないことを知っていますが、やはり帰ってくるのはリストセットの辞書形式です。
    実は上に書いたのは二つの方法です。確定したら一つの値を調べて、query_を使います。one.プロジェクトの方法。


    上記のまとめ
    djangoで実行される原生sqlには3つの方法があります。extra、raw、from django.db import connection。
    その中のextraはほとんど役に立たないで、rawは間に合わせて、しかしmodelsと結び付けることがいて、connectionは最も柔軟で、しかしデフォルトの帰るのは[tuple、tuple、tuple、]フォーマットです。
    改良して二つの方法をカプセル化しました。all_ディックone.一つは複数を検索し、一つは単一を検索し、そして「dict、dict、dict」に戻ります。
    アドバイス
    query_のみ使用しますall_ディックone.プロジェクト
    プロジェクトコード
    
    django_exec_sql.zip 
    本文の完全なコードの小さい仲間が必要で、本公衆号のバックグランドでキーワードに返答することができます。
    締め括りをつける
    上記は入門の方式で解決しました。djangoを通じて、元の生活sqlを実行するにはどうすればいいですか?
    今日の私は昨日より強かったです。これからも同じです。
    ここでは、ハンドグリップについてDjangoで元のSQLを実行する方法を教えています。これまでの記事を検索したり、下記の関連記事を見たりしてください。これからも応援してください。