flask_sqlalchemyベース、データを変更して再検索を追加または削除

 

1.1設定および接続

  • SQLAlchemyのパイソン最も強力なORMフレームワーク
  • フラスコはSQLAlchemyのアクセスできる可能フラスコSQLAlchemyのフラスコ成分
  • 安装フラスコSQLAlchemyのインストールPIP
  • コンフィギュレーション
    • SQLALCHEMY_DATABASE_URI:データベース接続住所
    • SQLALCHEMY_TRACK_MODIFICATIONS:開いた後、追跡データベースを変更するかどうかは、パフォーマンスに影響を与えます
    • SQLALCHEMY_ECHO:オンにすると、コンソール内のSQL言語根本的な実行を印刷することができます
  • マッピングモデルクラス
    • クラス--->テーブル
    • Class属性--->フィールド
    • オブジェクト--->録音

  • 使用
    • アプリを作成されたオブジェクト
    • アプリによってデータベース接続オブジェクトのオブジェクトを作成します。
    • マッピングモデルを確立
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 配置数据库的连接地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:[email protected]:3306/test'
# 配置是否监听数据库变化, 性能较差, 不属于sqlalchemy本体
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 一旦开启, 可以显示底层执行的SQL语句
app.config['SQLALCHEMY_ECHO'] = True
# 创建数据库连接
db = SQLAlchemy(app)

# ORM 类->表  类属性->字段 对象->记录
class User(db.Model):
    __tablename__ = 't_user'  # 设置表明 默认为类名小写
    id = db.Column(db.Integer, primary_key=True)  # 主键 默认自增
    name = db.Column(db.String(20), unique=True, index=True)  # 设置唯一索引, 设置普通索引
    email = db.Column(db.String(128), unique=True)


@app.route('/')
def index():
    return 'index'

if __name__ == '__main__':
    db.drop_all()
    db.create_all()
    app.run(debug=True, host='0.0.0.0')

 

1.2増加データ

  1. データオブジェクトを作成します。
  2. (対応するSQL文に変換)セッションに追加
  3. セッションを提出してください(この時間は、トランザクションをコミットし、コミットが失敗したトランザクションは、それが自動的にロールバックされます)
@app.route('/')
def index():
    """增加数据"""
    # 1. 创建数据对象
    user1 = User(name='zs', age=20)
    # user1.name = 'zs'
    # user1.age = 20
    
    # 2. 添加到会话中 (转为对应的sql语句)
    db.session.add(user1)
    # 添加多个数据
    # db.session.add_all([user1, user2, user3])
    
    # sqlalchemy会自动创建隐式的事务, 并将sql操作添加到事务中
    # 3. 提交会话, 此时就会提交事务, 事务提交失败, 会自动回滚
    db.session.commit()

    return 'index'

 

1.3データのクエリ

  • すべてのユーザーデータを発見
User.query.all() # 返回的是列表, 里边包含的是模型对象
  • どのように多くのユーザーを発見
User.query.count()
  • 最初のユーザーのクエリ
User.query.first() # 返回模型对象
  • 4ユーザIDを照会する[3ウェイ]
User.query.get(4) # 根据id查询 
User.qeury.filter_by(id=4).all() # 简单查询器, 通过关键字实参来匹配字段, 
# 返回BaseQuery对象, 可以续接更复杂的查询条件 all/count/first User.query.filter(User.id==4).first() # 复杂查询器 参数为恒等式/函数 返回BaseQuery对象
  • すべてのユーザーのための文字グラムのを終了クエリ名[含める/スタート]
User.query.filter(User.name.endswith('g')).all() # 名字以g结尾 
User.query.filter(User.name.startwith('w')).all() # 名字以w开头 
User.query.filter(User.name.contains('n')).all() # 名字包含n 
User.query.filter(User.name.like('w%n%g')).all() # 模糊查询
  • すべてのユーザーは、[2つの方法]リーに始めている名前とメールアドレスを問い合わせます
User.query.filter(User.name.startswith('li'), User.email.startswith('li')).all()
from sqlalchemy import and_ 
User.query.filter(and_(User.name.startswith('li'), User.emailstartswith('li'))).all()
  • クエリは、25歳または終了[メール]すべてのユーザーのitheima.com」であり
from sqlalchemy import or_ 
User.query.filter(or_(User.age==25, User.email.endswith('itheima.com'))).all()
  • すべてのユーザーは、名前が[二つの方法]の王を意味するものではありません問い合わせます
from sqlalchemy import not_ 
User.query.filter(not_(User.name=='wang'))).all() User.query.filter(User.name != 'wang')).all()
  • クエリのID [1、3、5、7、9ユーザ
User.query.filter(User.id.in_([1,3,5,7,9])).all()
  • すべてのユーザーが小さいから大きな、そしてIDの降順に年齢を押すと、最初の5つを取ります
User.query.order_by(User.age, User.id.desc())).limit(5).all()
  • 小規模から大規模なデータ・ビット2-5にクエリの年齢
User.query.order_by(User.age).offset(1).limit(4).all()
  • データページングクエリ、3ページ、2ページ目のクエリ
pn = User.qeury.paginate(2, 3) 
pn.items  # 该页的数据 
pn.pages  # 总页数 
pn.page  # 当前页码
  • クエリの数各年齢
from sqlalchemy import func 
db.session.query(User.age, func.count(User.name)).group_by(User.age).all()
  • 問合せのみ(二つの方法)は、デフォルトの選択で使用されて最適化し、生活やメールボックスの所有者を照会します*
users = User.query.options(load_only(User.name, User.email)).all() data = db.session.query(User.name, User.email).all()

1.3.1スロークエリ分析

# 在mysql的配置文件 /etc/mysql/mysql.conf.d/mysql.cnf[mysqld]中配置懒查询 
slow_query_log = ON # 是否已经开启慢查询 
long_query_time = 1 # 慢查询统计标准, 超过1秒 
slow_query_log_file = /usr/local/mysql/data/zzz-slow.log # 慢查询日志文件路径 log_queries_not_using_indexes = 1 # 如果值设置为ON, 则会记录所有利用索引的查询,性能优化时开启此项, 平时不要开启 

# 重启mysql sudo /etc/init.d/mysql restart 
# 查看懒查询启动情况 show variables like '%slow%'; show varibales like '%long_query_time%'; 

# 懒查询分析工具 
mysqldumpslow 
# -s: 排序方式 c 查询次数 t 查询时间 l 等待锁的时间 r 返回的记录数 at 平均查询时间 
# -t: 返回前面多少条的数据; 
# -g: 包含什么, 大小写不敏感的; 

# 返回记录中查询次数最多的10个语句 
sudo mysqldumpslow -s c -t 10 /usr/local/mysql/data/zzz-slow.log 

# 返回记录中含有'user', 并且按照平均时间排序最慢的前10条语句 
sudo mysqldumpslow -s at -t 10 -g 'user' /usr/local/mysql/data/zzz-slow.log

 

1.4更新、および削除

  • 変更名=「ZS」ユーザー名「リージ」
# 先查询, 后修改 
user_obj = User.query.filter_by(name='zs').first() 
user_obj.name = 'lisi' 
# 使用update的子查询, update t_user set name='lisi' where name='zs'; 
User.query.filter_by(name='zs').update({'name':'lisi'}) 
db.session.commit() # 提交会话
  • 名前=「のZS」ユーザーを削除します。
user_obj = User.query.filter_by(name='zs').first() 
db.session.delete(user_obj) # delete的子查询 
User.query.filter_by(name='zs').delete() 
db.session.commit()

 

1.5パイプライン

# sqlalchemy对mysql进行了优化, 实现了类似redis管道的机制, 如果会话中没有要执行查询 
# (包含更新/删除的子查)和主动flush, 则所有的sql操作会在commit时才一起发送给mysql服务器 
# 添加数据 
user1 = User(name='zs', age=20) 
db.session.add(user1) 
# User.query.all()  # 会将当前会话中的所有sql立即发送给mysql服务器 
# db.session.flush()  # 会将当前会话中的所有sql立即发送给mysql服务器 
db.session.commit()

おすすめ

転載: blog.csdn.net/Regan_Yu/article/details/95179571