• Flask SQLAlchemy & model


    Flask-SQLAlchemy

    Flask-SQLAlchemy库让flask更方便的使用SQLALchemy,是一个强大的关系形数据库框架,既可以使用orm方式操作数据库,也可以使用原始的SQL命令.

    需要安装的包

    MySQL

    SQLAlchemy

    Flask-SQLAlchemy

    mysqlclient

    配置Flask-SQLAlchemy

    示例:

    MySQL:

    mysql://username:password@hostname/database

    定义模型

    from sqlalchemy import Column, Integer, MetaData, VARCHAR
    from flask_sqlalchemy import SQLAlchemy
    from flask import Flask
    
    app = Flask(__name__)
    
    #配置数据库地址
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:wjjf2008@127.0.0.1:3306/internet_plus?charset=utf8'
    #该配置为True,则每次请求结束都会自动commit数据库的变动
    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
    
    db = SQLAlchemy(app)
    #也可以db = SQLAlchemy()        db.init_app(app)
    
    
    class User(db.Model): #使用继承至db.Model的类来定义模型
        __tablename__ = 'User'  #if use Declarative,tablename is needed
        user_id = db.Column('user_id', db.Integer, autoincrement=True, primary_key = True)
        user_name = db.Column('user_name', db.VARCHAR(20), nullable=False, unique=True, default='')
        user_phone = db.Column('user_phone', db.VARCHAR(20), nullable=False, default='')
        user_email = db.Column('user_email', db.VARCHAR(30), nullable=False, default='')
    
        def __repr__(self):
            return '<User %r>' % self.user_name
    
    if __name__ == '__main__':
        db.create_all() #创建数据库

    常用字段选项:

      primary_key 设置主键

      unique 是否唯一

      index 是否创建索引

      nullable 是否允许为空

      default 设置默认值,可以传入函数的引用 如传入 datetime.datetime.utcnow 则每次创建时时间都是最新时间

    数据库操作

    • 插入数据
    from models2 import User, db
    from flask_sqlalchemy import SQLAlchemy
    
    #建立一个新用户
    u = User();
    u.user_name = 'Jeffrey'
    u.user_phone = '15958360766'
    u.user_email = '729957621@qq.com'
    #将用户添加到数据库会话中
    db.session.add(u)
    #将数据库会话中的变动提交到数据库中,如果不Commit,数据库中是没有改动的
    db.session.commit()
    • 查找数据
    #返回所有用户保存到list中
    user_list = User.query.all()
    
    #查找username为abc的第一个用户,返回用户实例
    user_list = User.query.filter_by(user_name='Jeffrey').first()
    • 删除数据
    u = User.query.first()
    db.session.delete(u)
    db.session.commit()
    • 修改数据
    u = User.query.first()
    u.username = 'sb'
    db.session.commit()

     另一种使用数据库的方法

    from sqlalchemy import Column, Integer, MetaData, VARCHAR
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker
    from flask.ext.sqlalchemy import SQLAlchemy
    
    metadata = MetaData()
    Base = declarative_base(metadata=metadata)
    db = 'mysql://root:mysqlpassword@127.0.0.1:3306/dbname?charset=utf8'
    
    def get_session(): #此处返回一个session
        #create_engine() 会返回一个数据库引擎,echo 参数为 True 时,会显示每条执行的 SQL 语句,生产环境下可关闭。
        engine = create_engine(db, encoding="utf-8")
        #sessionmaker() 会生成一个数据库会话类。这个类的实例可以当成一个数据库连接,它同时还记录了一些查询的数据,并决定什么时候执行 SQL 语句。
        mysql_session_maker = sessionmaker(bind=engine)
        session = mysql_session_maker()
        '''
        # 拿到 session 后,就可以执行 SQL 了
        session.execute('create database abc')
        print(session.execute('show databases').fetchall())
        session.execute('use abc')
        # 建 user 表的过程略
        print
        session.execute('select * from user where id = 1').first()
        print
        session.execute('select * from user where id = :id', {'id': 1}).first()
        '''
        return session
    
    sql_session = get_session()
    
    
    class User(Base):
        __tablename__ = 'User'  #if use Declarative,tablename is needed
        user_id = Column('user_id', Integer, autoincrement=True, primary_key = True)
        user_name = Column('user_name', VARCHAR(20), nullable=False, unique=True, default='')
        user_phone = Column('user_phone', VARCHAR(20), nullable=False, default='')
        user_email = Column('user_email', VARCHAR(30), nullable=False, default='')
    
    if __name__ == '__main__':
        #定义一个表
        engine = create_engine(db, encoding="utf-8", echo=True)
        Base.metadata.create_all(engine)
        print(sql_session.query(User).count())

     Flask官方文档:http://docs.jinkan.org/docs/flask/

  • 相关阅读:
    判断文件类型
    Kruskal算法
    《大话数据结构》冒泡排序错误修正
    COM组件(ActiveX)控件注册失败
    IP路由协议简析
    Prim算法
    邻接图的深度广度优先遍历
    矩阵图的深度广度遍历
    oracle spatial下对wkt字符串操作遇到srid的解决方案
    Arcgis Javascript中geometryEngine报错’hq‘of undefined的解决方法
  • 原文地址:https://www.cnblogs.com/dear_diary/p/6790808.html
Copyright © 2020-2023  润新知