djangoのデータベース操作

8066 ワード

プレゼンテーションツールの使用方法
1 shellツール
Djangoのmanageツールはshellコマンドを提供し、現在のプロジェクトの実行環境(データベースへの接続など)を構成し、端末でテストpython文を直接実行できるようにします.
次のコマンドでshellに入ります.
python manage.py shell

2つのモデルクラスをインポートして、後で使用します.
from booktest.models import BookInfo, HeroInfo

2 MySQLデータベースログの表示
mysqlデータベース・ログを表示すると、データベースに対する操作レコードが表示されます.mysqlログファイルはデフォルトで生成されません.次の構成が必要です.
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

68,69行前の#を削除し、保存して次のコマンドを使用してmysqlサービスを再起動します.
sudo service mysql restart

次のコマンドを使用してmysqlログファイルを開きます.
データベース操作—追加、削除、変更、検索
1増加
データを増やすには2つの方法があります.
1)save
モデルクラスオブジェクトを作成することで、実行オブジェクトのsave()メソッドがデータベースに保存されます.
>>> from datetime import date
>>> book = BookInfo(
    btitle='   ',
    bput_date=date(1988,1,1),
    bread=10,
    bcomment=10
)
>>> book.save()
>>> hero = HeroInfo(
    hname='   ',
    hgender=0,
    hbook=book
)
>>> hero.save()
>>> hero2 = HeroInfo(
    hname='   ',
    hgender=0,
    hbook_id=book.id
)
>>> hero2.save()

2)create
モデルクラスを通過する.objects.create()保存.
>>> HeroInfo.objects.create(
    hname='   ',
    hgender=0,
    hbook=book
)


2クエリー
2.1基本クエリー
getは単一の結果をクエリーし、存在しない場合はモデルクラスを放出する.DoesNotExist異常.
allは複数の結果をクエリーします.
countクエリ結果の数.
>>> BookInfo.objects.all()
, , , , ]>
>>> book = BookInfo.objects.get(btitle='   ')
>>> book.id
5

>>> BookInfo.objects.get(id=3)

>>> BookInfo.objects.get(pk=3)

>>> BookInfo.objects.get(id=100)
Traceback (most recent call last):
  File "", line 1, in 
  File "/Users/delron/.virtualenv/dj/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/delron/.virtualenv/dj/lib/python3.6/site-packages/django/db/models/query.py", line 380, in get
    self.model._meta.object_name
db.models.DoesNotExist: BookInfo matching query does not exist.

>>> BookInfo.objects.count()
6

2.2クエリーのフィルタ
SQLのwhere機能を実現します.
  • filterは、複数の結果
  • をフィルタリングする.
  • exclude条件を満たす残りの結果を排除
  • getフィルタ単一結果
  • フィルタ条件の使用については,上記3つの方法は同じであるため,フィルタのみで説明する.
    フィルタ条件の表現構文は次のとおりです.
        __     = 
    #                   ,              
    

    1)等しい
    exact:判定などを表す.
    例:照会番号が1の図書.
    BookInfo.objects.filter(id__exact=1)
        :
    BookInfo.objects.filter(id=1)
    

    2)ファジイクエリ
    contains:含むかどうか.
    説明:%を含めるには、エスケープを必要としないで、直接書けばいいです.
    例:本名に「伝」が含まれている図書を調べる.
    BookInfo.objects.filter(btitle__contains=' ')
    

    startswith、endswith:値の先頭または末尾を指定します.
    例:本の名前を「部」で結んだ図書を調べる
    BookInfo.objects.filter(btitle__endswith=' ')
    

    以上の演算子はいずれも大文字と小文字を区別し、これらの演算子の前にiを加えるとiexact、icontains、istartswith、iendswithなどの大文字と小文字を区別しないことを表す.
    3)空のクエリ
    isnull:nullかどうか.
    例:本の名前が空でない図書を調べる.
    BookInfo.objects.filter(btitle__isnull=False)
    

    4)範囲クエリー
    in:範囲に含めるかどうか.
    例:照会番号が1または3または5の図書
    BookInfo.objects.filter(id__in=[1, 3, 5])
    

    5)比較クエリー
  • gtより大きい(greater then)
  • gte以上(greater then equal)
  • lt未満(less then)
  • lteが(less then equal)
  • 以下である
    例:照会番号が3より大きい図書
    BookInfo.objects.filter(id__gt=3)
    

    等しくない演算子はexclude()フィルタを使用します.
    例:照会番号が3に等しくない図書
    BookInfo.objects.exclude(id=3)
    

    6)日付照会
    year、month、day、week_day、hour、minute、second:日付時間タイプの属性を演算します.
    例:1980年に発表された図書を調べる.
    BookInfo.objects.filter(bpub_date__year=1980)
    

    例:1980年1月1日以降に発表された図書を調べる.
    BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
    

    Fオブジェクト
    以前のクエリはオブジェクトのプロパティと定数値を比較していましたが、2つのプロパティはどのように比較しますか?A:Fオブジェクトを用いる、djangoに定義される.db.modelsで.
    構文は次のとおりです.
    F(   )
    

    例:検索読書量が評論量以上の図書.
    from django.db.models import F
    
    BookInfo.objects.filter(bread__gte=F('bcomment'))
    

    Fオブジェクト上で算数演算を使用できます.
    例:読書量が2倍以上の評論量の図書を検索する.
    BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
    

    Qオブジェクト
    複数のフィルタは、論理と関係を表すandキーワードを1つずつ呼び出し、sql文のwhere部分と同じです.
    例:検索読書量が20より大きく、番号が3未満の図書.
    BookInfo.objects.filter(bread__gt=20,id__lt=3)
     
    BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
    

    論理またはorのクエリを実現する必要がある場合は、djangoでQ()オブジェクトを意味するQ()オブジェクト結合|演算子を使用する必要がある.db.modelsで.
    構文は次のとおりです.
    Q(   __   = )
    

    例:検索読解量が20より大きい図書をQ対象に書き換えると以下のようになる.
    from django.db.models import Q
    
    BookInfo.objects.filter(Q(bread__gt=20))
    

    Qオブジェクトは,|接続,&は論理和,|は論理和を表す.
    例:照会読解量が20より大きい、または番号が3より小さい図書は、Qオブジェクトのみで実現できる
    BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
    

    Qオブジェクトの前に~オペレータを使用して、not以外を表すことができます.
    例:照会番号が3に等しくない図書.
    BookInfo.objects.filter(~Q(pk=3))
    

    集約関数
    aggregate()フィルタを使用して集約関数を呼び出します.集約関数は、Avg平均、Count数、Max最大、Min最小、Sum求和、djangoで定義される.db.modelsで.
    例:図書の総読書量を調べる.
    from django.db.models import Sum
    
    BookInfo.objects.aggregate(Sum('bread'))
    

    aggregateの戻り値は辞書タイプで、フォーマットは次のとおりです.
      {'   __     ': }
       :{'bread__sum':3}
    

    countを使用する場合はaggregate()フィルタは一般的に使用されません.
    例:図書の総数を調べる.
    BookInfo.objects.count()
    

    count関数の戻り値は数値であることに注意してください.
    2.3ソート
    order_の使用by結果のソート
    BookInfo.objects.all().order_by('bread')  #   
    BookInfo.objects.all().order_by('-bread')  #   
    

    2.4関連クエリー
    1~複数のアクセス構文:
    対応するモデルクラスオブジェクト.多対応モデルクラス名小文字_set例:
    b = BookInfo.objects.get(id=1)
    b.heroinfo_set.all()
    

    複数から1へのアクセス構文:
    複数の対応するモデルクラスオブジェクト複数の対応するモデルクラスのリレーショナルクラス属性名の例:
    h = HeroInfo.objects.get(id=1)
    h.hbook
    

    対応するモデルクラス関連オブジェクトにアクセスするid構文:
    複数の対応するモデルクラスオブジェクト関連クラスのプロパティ_id
    例:
    h = HeroInfo.objects.get(id=1)
    h.hbook_id
    

    クエリーの関連付け
    複数モデルクラス条件からモデルクラスデータを問合せます.
    構文は次のとおりです.
            __   __     = 
    

    注意:「_演算子」セクションがない場合は、「等しい」を表します.
    例:
    図書を調べて、図書の英雄を“孫悟空”に要求します
    BookInfo.objects.filter(heroinfo__hname='   ')
    

    図書を調べて、図書の中の英雄の説明に“8”を含むことを要求します
    BookInfo.objects.filter(heroinfo__hcomment__contains=' ')
    

    1つのモデルクラス条件から複数のモデルクラスデータを問合せます.
    構文は次のとおりです.
             __       __     = 
    

    注意:「_演算子」セクションがない場合は、「等しい」を表します.
    例:
    「天龍八部」という本を調べたすべての英雄.
    HeroInfo.objects.filter(hbook__btitle='    ')
    

    30以上の読書量を持つすべてのヒーローを検索
    HeroInfo.objects.filter(hbook__bread__gt=30)
    

    3修正
    更新の変更には2つの方法があります
    1)save
    モデルクラスオブジェクトのプロパティを変更し、save()メソッドを実行します.
    hero = HeroInfo.objects.get(hname='   ')
    hero.hname = '   '
    hero.save()
    

    2)update
    モデルクラスを使用します.objects.filter().update()は、影響を受けるローの数を返します.
    HeroInfo.objects.filter(hname='   ').update(hname='  ')
    

    4削除
    削除には2つの方法があります
    1)モデルクラスオブジェクトdelete
    hero = HeroInfo.objects.get(id=13)
    hero.delete()
    

    2)模型類.objects.filter().delete()
    HeroInfo.objects.filter(id=14).delete()
    tail -f /var/log/mysql/mysql.log  #               
    #      sudo  ,  
    # sudo tail -f /var/log/mysql/mysql.log