pythonフレームワークのFlask基礎編(二)------データベースの操作

21823 ワード

1.flask接続データベースの4つのステップ:
  • サードパーティ製データベース拡張パッケージへの移行:from flask_sqlalchemy import SQLAlchemy
  • configプロパティを構成し、データベースに接続する:app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@localhost/first_flask"app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
  • データベースfirst_の作成flask
  • 操作データベースオブジェクトの作成:db=SQLAlchemy(app)
  • コードの説明を直接行います.
     
    # -*- coding:utf-8 -*-
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    # url    :      ://   :  @ip  :   (      )/    
    app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@localhost/first_flask"
    #           .     .          .                  
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    #           
    db = SQLAlchemy(app)
    
    
    class Role(db.Model):
    
        __tablename__ = "roles"
        id = db.Column(db.Integer,primary_key=True)
        name = db.Column(db.String(16),unique=True)
        #  Role     uses  ,  users 。
        # backref     User     role  ,  roles 。  flask     。
        users = db.relationship('User',backref="role")
        #    __str__  。
        def __repr__(self):
            return "Role: %s %s" % (self.id,self.name)
    
    
    class User(db.Model):
        #           ,          ,          user。
        __tablename__ = "users"
        id = db.Column(db.Integer,primary_key=True)
        name = db.Column(db.String(16),unique=True)
        email = db.Column(db.String(32),unique=True)
        password = db.Column(db.String(16))
        #       , django   。flask             ,          
        role_id = db.Column(db.Integer,db.ForeignKey("roles.id"))
    
        def __repr__(self):
            return "User: %s %s %s %s" % (self.id,self.name,self.password,self.role_id)
    
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    
    if __name__ == '__main__':
        #       
        db.drop_all()
        #    
        db.create_all()
    
        ro1 = Role(name = "admin")
        #   ro1        ,    。
        db.session.add(ro1)
        
        ro2 = Role()
        ro2.name = 'user'
        db.session.add(ro2)
        #             
        db.session.commit()
    
        us1 = User(name='wang', email='[email protected]', password='123456', role_id=ro1.id)
        us2 = User(name='zhang', email='[email protected]', password='201512', role_id=ro2.id)
        us3 = User(name='chen', email='[email protected]', password='987654', role_id=ro2.id)
        us4 = User(name='zhou', email='[email protected]', password='456789', role_id=ro1.id)
        us5 = User(name='tang', email='[email protected]', password='158104', role_id=ro2.id)
        us6 = User(name='wu', email='[email protected]', password='5623514', role_id=ro2.id)
        us7 = User(name='qian', email='[email protected]', password='1543567', role_id=ro1.id)
        us8 = User(name='liu', email='[email protected]', password='867322', role_id=ro1.id)
        us9 = User(name='li', email='[email protected]', password='4526342', role_id=ro2.id)
        us10 = User(name='sun', email='[email protected]', password='235523', role_id=ro2.id)
        db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10])
        db.session.commit()
        app.run(debug=True)

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    次のバグを挿入します.
    テーブルの作成が完了すると、次の2つの文に注意します.
     #       
        db.drop_all()
        #    
        db.create_all()

    テーブルにデータを挿入すると、次のようなエラーが発生します.
    sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1062, "Duplicate entry 'admin' for key 'name'") [SQL: u'INSERT INTO roles (name) VALUES (%s)'] [parameters: ('admin',)]
    ネット上の多くの資料を調べて、フィールドの制約unique=Trueを外せばいいと言っていますが、根本的な原因はここではありません.
    なぜならapp.run(debug=True).Debugモードをオンにすると、コードを変更すると、テーブルの削除やテーブルの作成などの2つのコメントが表示され、データを挿入するコメントが表示されます.このプロシージャdebugモードのデフォルトでは、プログラムが実行されます.データベースにはすでにデータがあり、再び手動で実行すると、データベースにデータが挿入され、エラーが表示されます.フィールドの制約は一意性のuniqueであるため、解決策は2つあります.
    1つ目は、テーブルの削除とテーブルの作成という2つの文のコメントをしないで、実行するたびに2つの文を持っていくことです.Debugモードで自動的に実行しても、手動でプログラムを実行しても、テーブルを削除してからテーブルを作成するので、何度実行しても怖くありません.
    2つ目は、debugモードをオフにします.そうですrun()
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    2.データベースの追加削除:
    1.次の方法は、新しいクエリーを返し、エフェクタと組み合わせて使用する必要があります.
    filter():フィルタリングで、機能が強い.filter_by():フィルタリングは、比較的簡単なフィルタリングシーンで使用されます.
    order_by():並べ替え.デフォルトは昇順で、降順にはパケットが必要です:from sqlalchemy import*.次にdescメソッドを導入する.例えばorder_by(desc("email")).メールボックスのアルファベットの降順に並べ替えます.
     
    group_by():グループ化します.
    2.以下は、上のフィルタに合わせて使用する一般的なアクチュエータです.
    get():idが数に等しい関数を取得します.たとえば、id=1のオブジェクトをクエリーします.get(1).カッコに「id=」はなく、idの数値に直接入力するとokになります.この関数の機能は、プライマリ・キーが数に等しいオブジェクトをクエリーすることです.
    all():すべてのデータをクエリーします.
    first():最初のデータをクエリーします.
    count():クエリー結果の数を返します.
    paginate():ページングクエリーで、ページングオブジェクトを返します.paginate(パラメータ1,パラメータ2,パラメータ3)
    パラメータ1:現在は何ページ目ですか.パラメータ2:各ページにいくつかのレコードが表示されます.パラメータ3:エラーを返すかどうか.
    返されるページング・オブジェクトには、3つのプロパティがあります.items:クエリーの結果を取得し、pages:合計何ページを取得し、page:現在のページを取得します.
    3.一般的な論理子:
    バッグを入れる必要があるのは、from sqlalchemy import*
    not_  and_  or_上に述べたソートdescもあります.
    よく使われる内蔵:in_フィールドがどの範囲にあるかを示します.
    4.その他の関係のデータベース・クエリー:
    endswith():何で終わりますか.
    startswith():何で始まりますか.
    contains():含む
    5.次は上記の使い方を体得します.
    1.         
    User.query.all()
    2.         
    User.query.count()
    3.    1   
    User.query.first()
    
    4.   id 4   [3   ]
    User.query.get(4)
    User.query.filter_by(id=4).first()    
    User.query.filter(User.id==4).first()
    
    filter:(  .   ==)
    filter_by:(   =)
    
    filter_by:          ,        
    filter filter_by      ,       ,  or_、in_   。
    
    
    5.          g     [  /  ]
    User.query.filter(User.name.endswith('g')).all()
    User.query.filter(User.name.contains('g')).all()
    
    6.        wang     [2   ]
     from sqlalchemy import not_
    _( ) User.query.filter(not_(User.name
    =='wang')).all() User.query.filter(User.name!='wang').all() 7. li [2 ] from sqlalchemy import and_ User.query.filter(and_(User.name.startswith('li'), User.email.startswith('li'))).all() User.query.filter(User.name.startswith('li'), User.email.startswith('li')).all() 8. password `123456` `email` `itheima.com` from sqlalchemy import or_ User.query.filter(or_(User.password=='123456', User.email.endswith('itheima.com'))).all() 9. id [1, 3, 5, 7, 9] User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all() 10. name liu User.query.filter_by(name='liu').first().role.name 11. , User.query.order_by('email').all() User.query.order_by(desc('email')).all() 12. 2 , 3 help(User.query.paginate) : 1. 2. 3. pages = User.query.paginate(2, 3, False) pages.items # pages.pages # pages.page #

     3.サードパーティ拡張フレームワークを使用してデータベースファイルを移行します.
    フレームワークを使用して構成するコードは次のとおりです.
    # -*- coding:utf-8 -*-
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy  #          
    from flask_script import Manager  #          
    from flask_migrate import Migrate,MigrateCommand  #              
    
    app = Flask(__name__)
    app.debug = True
    app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:mysql@localhost/second_flask"
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    
    db = SQLAlchemy(app)
    manager = Manager(app)
    #       
    migrate = Migrate(app,db)
    #            ‘db’ 
    manager.add_command('db',MigrateCommand)
    
    
    class Role(db.Model):
        __tablename__ = "table_roles"
        id = db.Column(db.Integer,primary_key=True)
        name = db.Column(db.String(16),unique=True)
        info = db.Column(db.String(100))
        Users = db.relationship("User",backref='role')
    
    
    class User(db.Model):
        __tablename__ = "table_users"
        id = db.Column(db.Integer,primary_key=True)
        name = db.Column(db.String(16),unique=True)
        info = db.Column(db.String(200))
        role_id = db.Column(db.Integer,db.ForeignKey("table_roles.id"))
    
    
    
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    
    if __name__ == '__main__':
    
        manager.run()

     
    移行コマンドを使用すると、次のようになります.
    例えば、上記のコードが存在するファイル名はdatabaseである.py.
    1.python database.py db init移行ファイルを管理するmigrationsディレクトリを生成
    2.python database.py db migrate-m「コメント」は、データテーブルの作成と更新の異なるバージョンのコードを記録するmigrations/versionsでファイルを生成します.
    3.python database.py db upgradeは、データベースに対応するテーブルを生成します.
    4.表を変更する必要がある場合は、変更が終わったら、まず第2ステップを実行し、それから第3ステップを実行します.
    5.データテーブルのバージョン番号を変更する必要がある場合は、次の操作を行います.
    python database.py db upgradeバージョン番号アップバージョン番号アップ
    python database.py db downgradeバージョン番号下向きにバージョン番号を変更
    使用可能な他の文:
    python database.py db history履歴バージョン番号の表示
    python database.py db current現在のバージョン番号の表示
     
    転載先:https://www.cnblogs.com/RomanticLife/p/8372624.html