zoukankan      html  css  js  c++  java
  • flask-sqlalchemy 迁移数据(生成数据库表)与 查询数据

    1, 生成表

      db.Model主要用于数据库的增删改查操作, 构建表交给db.Table完成

      安装 pip install flask-migrate

    from datetime import datetime
    from flask_sqlalchemy import SQLAlchemy
    from sqlalchemy.dialects.mysql import TINYINT, BIGINT, VARCHAR, CHAR, DATETIME, INTEGER
    # 使用原生sqlalchemy创建字段
    app = create_app()
    # 创建数据库连接对象
    db = SQLAlchemy(app)
    # 构建表
    t_user = db.Table('user_basic',
                      db.Column('user_id', BIGINT(10, unsigned=True), nullable=False, primary_key=True, autoincrement=True, comment='主键'),
                      db.Column('status', TINYINT(1), nullable=False, default=1, comment="状态"),
                      # db.Column('status1', TINYINT(1), nullable=False, default=1, comment="状态1"),
                      db.Column('mobile', CHAR(11), nullable=False, unique=True, comment='手机号'),
                      db.Column('create_time', DATETIME, nullable=False, default=datetime.now, comment='创建时间'),
                      db.Column('update_time', DATETIME, nullable=False, default=datetime.now, onupdate=datetime.now, comment='更新时间'),
                      # 注意: 如果有外键, 定义方式和普通字段一样, 可以添加索引提高性能
                      # db.Column('leader_id', BIGINT(10, unsigned=True), default=0, comment='上级的id', index=True),
                      mysql_engine='MyISAM',
                      mysql_charset='utf8mb4')
    
    
    if __name__ == '__main__':
        db.drop_all()
        db.create_all() #调用create_all()能找到对应的db.Tabke然后生成表

    注释:逻辑外键添加index = True,生成外键,查询速度快

    2,数据增删查改的模型:

    from datetime import datetime
    
    from flask_sqlalchemy import SQLAlchemy
    
    def create_app(): #在其他地方封装的
        app = Flask(__name__)
        app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/sqlalchemy_test?charset=utf8'
        app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    
        return app
    
    app = create_app()
    
    # 为了避免和创建表的db产生冲突, 创建专门用于数据操作的SQLAlchemy对象
    model_db = SQLAlchemy(app)
    
    
    class User(model_db.Model):  # db.Model主要用于数据的增删改查, 构建表交给db.Table去完成
        __tablename__ = 'user_basic'
        # 由于模型不用于建表, 所以类型不需要设置的很严谨, 并可以省略大部分字段细节(除了default参数)
        user_id = model_db.Column(model_db.Integer, primary_key=True)
        status = model_db.Column(model_db.Integer, default=1)
        mobile = model_db.Column(model_db.String(11))
        create_time = model_db.Column(model_db.DateTime, default=datetime.now)
        update_time = model_db.Column(model_db.DateTime, default=datetime.now)
    
    
    @app.route('/')
    def index():
        user1 = User()
        user1.mobile = '18912341234'
        model_db.session.add(user1)
        model_db.session.commit()
        return 'index'
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    注释:建表时如果字段中有default字段时,查询等操作的模型类也要写,不写会报错

    2,迁移数据,  添加

    当数据库升级,如增加字段,修改字段类型等,(删除外键等)

    from datetime import datetime
    from flask_sqlalchemy import SQLAlchemy
    from sqlalchemy.dialects.mysql import TINYINT, BIGINT, VARCHAR, CHAR, DATETIME, INTEGER
    from tool import create_app
    from flask_migrate import Migrate
    
    app = create_app()
    # 创建数据库连接对象
    db = SQLAlchemy(app)
    
    # 初始化迁移器
    Migrate(app, db)
    
    # 构建表
    t_user = db.Table('user_basic',
                      db.Column('user_id', BIGINT(10, unsigned=True), nullable=False, primary_key=True, autoincrement=True, comment='主键'),
                      db.Column('status', TINYINT(1), nullable=False, default=1, comment="状态"),
                      # db.Column('status1', TINYINT(1), nullable=False, default=1, comment="状态1"),
                      db.Column('mobile', CHAR(11), nullable=False, unique=True, comment='手机号'),
                      db.Column('create_time', DATETIME, nullable=False, default=datetime.now, comment='创建时间'),
                      db.Column('update_time', DATETIME, nullable=False, default=datetime.now, onupdate=datetime.now, comment='更新时间'),
                      # 注意: 如果有外键, 定义方式和普通字段一样, 可以添加索引提高性能
                      # db.Column('leader_id', BIGINT(10, unsigned=True), default=0, comment='上级的id', index=True),
                      mysql_engine='MyISAM',
                      mysql_charset='utf8mb4')
    
    
    if __name__ == '__main__':
        # db.drop_all()
        # db.create_all()
        pass
    View Code

    修改好后执行步骤,如果是已经改过,可以只执行最后两步

    1,export FLASK_APP = init_db.py  #指定文件夹

    2,flask db init  #生成migrations 文件 (迁移文件)

    3,flask db migrate 生成版本文件    查看是否有变化 versions 多了一个文件 (修改的地方)

    4,flask db upgrade  

  • 相关阅读:
    自定义TextInput中displayAsPassword的字符
    C#序列化与反序列化代码记录
    解决Discuz!NT"Code: 100, Message: 指定..."问题
    如何在asp.net项目开发的验证码图片和打印中区别0和O(零和字母O)
    "淘宝开放平台"可以成为程序员的摇钱树吗?
    Discuz!NT与asp.net整合集成实例教程
    最震撼的大片《2012》世界末日 电影 高画质 超DVD版清晰效果 在线视频播
    划时代的感人大片!《机器人总动员》(WALL.E) 在线播放
    从数据库某表转换并导入数据到另一表
    界面原型设计工具选择报告
  • 原文地址:https://www.cnblogs.com/wjun0/p/11857228.html
Copyright © 2011-2022 走看看