标签 flask 下的文章

我们在使用SQLAlchemy做数据的增删改查操作,我们是通过session对象来实现的。

  1. 构建session对象:所有和数据库的ORM操作都必须通过一个叫做session的会话对象来实现,通过以下代码来获取会话对象:

    from sqlalchemy.orm import sessionmaker
    
    engine = create_engine(DB_URI)
    session = sessionmaker(engine)()
  2. 添加对象:

    class User(Base):
        __tablename__ = 'user'
    
        id = Column(Integer,primary_key=True,autoincrement=True)
        name = Column(String(50))
        age = Column(Integer)
    • 创建对象,也即创建一条数据:

      u = User(name='xiaoning',age=18,country='china')
    • 将这个对象添加到session会话对象中:

      session.add(u)
    • 将session中的对象做commit操作(提交):

      session.commit()
    • 一次性添加多条数据:

      u1 = User(name='xiaoning',age=19,country='china')
      u2 = User(name='boke',age=20,country='china')
      session.add_all([u1,u2])
      session.commit()
  3. 查找对象:

    # 查找某个模型对应的那个表中所有的数据:
    all_user = session.query(User).all()
    # 使用filter_by来做条件查询
    all_user = session.query(User).filter_by(name='xiaoning').all()
    # 使用filter来做条件查询
    all_user = session.query(User).filter(User.name=='xiaoning').all()
    # 使用get方法查找数据,get方法是根据id来查找的,只会返回一条数据或者None
    user = session.query(User).get(primary_key)
    # 使用first方法获取结果集中的第一条数据
    user = session.query(User).first()

    小编在下一篇文章中将详细讲解查询。

    SQLAlchemy中filter()和filter_by()的区别
    1、filter引用列名时,使用“类名.属性名”的方式,比较使用两个等号“==”
    2、filter_by引用列名时,使用“属性名”,比较使用一个等号“=”
    3、在使用多条件匹配的时候,filter需要借助sqlalchemy里的and_ ; 而filter_by不需要,直接把多个匹配条件写在一起
    4、在使用多条件匹配时,用到>=、>、<=、<的情况,貌似不能使用filter_by。可能是姿势不对
  4. 修改对象:首先从数据库中查找对象,然后将这条数据修改为你想要的数据,最后做commit操作就可以修改数据了。

    user = session.query(User).first()
    user.name = 'boke'
    session.commit()
  5. 删除对象:将需要删除的数据从数据库中查找出来,然后使用session.delete方法将这条数据从session中删除,最后做commit操作就可以了。

    user = session.query(User).first()
    session.delete(user)
    session.commit()

SQLAlchemy连接数据库

使用SQLALchemy去连接数据库,其实就是需要使用一些配置信息,然后将他们组合成满足条件的字符串:# dialect+driver://username:password@host:port/database

HOSTNAME = '' # 主机地址
PORT = '3306' # 端口号
DATABASE = '' # 数据库
USERNAME = '' # 数据库账号
PASSWORD = '' # 数据库密码
DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE) # 链接

然后使用create_engine创建一个引擎engine,然后再调用这个引擎的connect方法,就可以得到这个对象,然后就可以通过这个对象对数据库进行操作了:

engine = create_engine(DB_URI)

# 判断是否连接成功
conn = engine.connect()
result = conn.execute('select 1')
print(result.fetchone())

将ORM模型映射到数据库中,即创建表

  1. declarative_base根据engine创建一个ORM基类。

    from sqlalchemy.ext.declarative import declarative_base
    engine = create_engine(DB_URI)
    Base = declarative_base(engine)
  2. 用这个Base类作为基类来写自己的ORM类。要定义__tablename__类属性,来指定这个模型映射到数据库中的表名。

    class User(Base):
        __tablename__ = 'user'
  3. 创建属性来映射到表中的字段,所有需要映射到表中的属性都应该为Column类型:

    class User(Base):
        __tablename__ = 'user'
        # 2. 在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。这些属性必须是sqlalchemy给我们提供好的数据类型。
        id = Column(Integer,primary_key=True,autoincrement=True)
        name = Column(String(50))
        age = Column(Integer)
  4. 使用Base.metadata.create_all()来将模型映射到数据库中。
  5. 一旦使用Base.metadata.create_all()将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了。
  6. 可以使用Base.metadata.drop_all()将继承Base类的表从数据库中删除。

SQLAlchemy常用数据类型

  1. Integer:整形,映射到数据库中是int类型。
  2. Float:浮点类型,映射到数据库中是float类型。他占据的32位。
  3. Double:双精度浮点类型,映射到数据库中是double类型,占据64位。
  4. String:可变字符类型,映射到数据库中是varchar类型.
  5. Boolean:布尔类型,映射到数据库中的是tinyint类型。
  6. DECIMAL:定点类型。是专门为了解决浮点类型精度丢失的问题的。在存储钱相关的字段的时候建议大家都使用这个数据类型。并且这个类型使用的时候需要传递两个参数,第一个参数是用来标记这个字段总能能存储多少个数字,第二个参数表示小数点后有多少位。
  7. Enum:枚举类型。指定某个字段只能是枚举中指定的几个值,不能为其他值。在ORM模型中,使用Enum来作为枚举,示例代码如下:

    class Article(Base):
        __tablename__ = 'article'
        id = Column(Integer,primary_key=True,autoincrement=True)
        tag = Column(Enum("python",'flask','django'))

    在Python3中,已经内置了enum这个枚举的模块,我们也可以使用这个模块去定义相关的字段。示例代码如下:

    class TagEnum(enum.Enum):
        python = "python"
        flask = "flask"
        django = "django"
    
    class Article(Base):
        __tablename__ = 'article'
        id = Column(Integer,primary_key=True,autoincrement=True)
        tag = Column(Enum(TagEnum))
    
    article = Article(tag=TagEnum.flask)
  8. Date:存储时间,只能存储年月日。映射到数据库中是date类型。在Python代码中,可以使用datetime.date来指定。示例代码如下:

    class Article(Base):
        __tablename__ = 'article'
        id = Column(Integer,primary_key=True,autoincrement=True)
        create_time = Column(Date)
    
    article = Article(create_time=date(2017,10,10))
  9. DateTime:存储时间,可以存储年月日时分秒毫秒等。映射到数据库中也是datetime类型。在Python代码中,可以使用datetime.datetime来指定。示例代码如下:

    class Article(Base):
        __tablename__ = 'article'
        id = Column(Integer,primary_key=True,autoincrement=True)
        create_time = Column(DateTime)
    
    article = Article(create_time=datetime(2011,11,11,11,11,11))
  10. Time:存储时间,可以存储时分秒。映射到数据库中也是time类型。在Python代码中,可以使用datetime.time来至此那个。示例代码如下:

    class Article(Base):
        __tablename__ = 'article'
        id = Column(Integer,primary_key=True,autoincrement=True)
        create_time = Column(Time)
    
    article = Article(create_time=time(hour=11,minute=11,second=11))
  11. Text:存储长字符串。一般可以存储6W多个字符。如果超出了这个范围,可以使用LONGTEXT类型。映射到数据库中就是text类型。
  12. LONGTEXT:长文本类型,映射到数据库中是longtext类型。只能用于Mysql数据库。

Column常用参数

  1. primary_key:设置某个字段为主键。
  2. autoincrement:设置这个字段为自动增长的。
  3. default:设置某个字段的默认值。在发表时间这些字段上面经常用。
  4. nullable:指定某个字段是否为空。默认值是True,就是可以为空。
  5. unique:指定某个字段的值是否唯一。默认是False。
  6. onupdate:在数据更新的时候会调用这个参数指定的值或者函数。在第一次插入这条数据的时候,不会用onupdate的值,只会使用default的值。常用的就是update_time(每次更新数据的时候都要更新的值)。
  7. name:指定ORM模型中某个属性映射到表中的字段名。如果不指定,那么会使用这个属性的名字来作为字段名。如果指定了,就会使用指定的这个值作为参数。这个参数也可以当作位置参数,在第1个参数来指定。
  8. comment:在数据库中的注释。

Flask开启debug模式的几种方式:

  1. app.run(debug=True)中传递一个参数debug=True就可以开启DEBUG模式。
  2. 设置app.deubg=True,就可以开启debug模式。
  3. 通过配置参数的形式设置DEBUG模式:app.config.update(DEBUG=True)
  4. 通过配置文件的形式设置DEBUG模式:。
    新建一个config.py文件:

    #encoding: utf-8
    DEBUG=True

    导入

    import config
    app.config.from_object(config)