【Flask】创建ORM映射以及参数解释

创建一个类,一个类对应了一个数据库中的一张表,类的数据属性对应了表中的字段名,这个类称为映射类。

一、主动创建映射

在这里插入图片描述

使用Declarative系统映射的类是根据基类定义的,换句话说每个映射类需要继承这个基类。我们使用declarative_base() 函数可以创建这个基类,

如下所示:

第一步:创建基类(所有ORM中的O,对象模型的超级父类)

from sqlalchemy.ext.declarative import declarative_base

#创建数据库引擎
engine=create_engine(DB_URI)
#创建基类
Base=declarative_base(engine)

第二步:定义python类和表的映射

注意1:用这个Base类作为基类来写自己的ORM类。要定义__tablename__类属性,来指定这个模型映射到数据库中的表名。

class Person(Base):
    __tablename__='t_person1' #表名
    id=Column(name='id',type_=Integer,primary_key=True)    #主键
    name=Column(name='name',type_=String(255))
    age=Column(name='age',type_=Integer)
    address=Column(name='address',type_=String(255))

注意2:创建属性来映射到表中的字段,所有需要映射到表中的属性都应该为Column类型:
注意3:在这个ORM模型中创建一些属性,来跟表中的字段进行 一一 映射。这些属性必须是sqlalchemy给我们提供好的数据类型

第三步:创建表

Base.metadata.create_all()

注意5: 一旦使用Base.metadata.create_all()将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了。

如果有新的字段需要重新映射到表中,举例:新加的字段是city和country

第四步:删除表,再次新建表

class Person(Base):
    __tablename__='t_person'  #创建表名,最好是t_开头
    id=Column(name='id',type_=Integer,primary_key=True,autoincrement=True)
    name=Column(name='name',type_=String(255))
    age=Column(name='age',type_=Integer)
    address=Column(name='address',type_=String(255))
    country=Column(name='country',type_=String(50))  #创建表之后新加的字段
    city=Column(name='city',type_=String(50))        #创建表之后新加的字段


Base.metadata.drop_all()   #删除表结构   创建表之后新加的字段,需要先删除表结构

#然后再创建表
Base.metadata.create_all()

二、SQLAlchemy常用数据类型

1. Integer:整形,映射到数据库中是int类型。
2. Float:浮点类型,映射到数据库中是float类型。他占据的32位。
3. Double:双精度浮点类型,映射到数据库中是double类型,占据64位 (SQLALCHEMY中没有)。
4. String:可变字符类型,映射到数据库中是varchar类型.
5. Boolean:布尔类型,映射到数据库中的是tinyint类型。
6. DECIMAL:定点类型。是专门为了解决浮点类型精度丢失的问题的。在存储钱相关的字段的时候建议大家都使用这个数据类型。并且这个类型使用的时候需要传递两个参数,第一个参数是用来标记这个字段总能能存储多少个数字,第二个参数表示小数点后有多少位。
例如:
sal = Column(name='sal', type_=DECIMAL(10, 2)) **
7. Enum:枚举类型。指定某个字段只能是枚举中指定的几个值,不能为其他值。在ORM模型中,使用Enum来作为枚举。
8. Date:存储时间,只能存储年月日。映射到数据库中是date类型。在Python代码中,可以使用datetime.date来指定。
9. DateTime:存储时间,可以存储年月日时分秒毫秒等。映射到数据库中也是datetime类型。在Python代码中,可以使用datetime.datetime来指定。
10. Time:存储时间,可以存储时分秒。映射到数据库中也是time类型。在Python代码中,可以使用datetime.time来创建值。
10. Text:存储长字符串。一般可以存储6W多个字符。如果超出了这个范围,可以使用LONGTEXT类型。映射到数据库中就是text类型。
11. LONGTEXT:长文本类型,映射到数据库中是longtext类型。这个类型属于Mysql方言里面的

针对上述SQLAlchemy常用数据类型,创建模型类

插入数据有疑问,枚举类,用sqlalchemy中的Enum,不要直接导入import enum

from sqlalchemy import Enum
#创建一个ORM模型,说明基于sqlalchemy  映射到mysql数据库的常用字段类型
Base=declarative_base(engine)

#创建模型类
class News(Base):
    __tablename__='t_news'
    id=Column(type_=Integer,primary_key=True,autoincrement=True)
    price1=Column(type_=Float)                      #存储数据时存在精度丢失问题
    price2=Column(type_=DECIMAL(10,4))
    title=Column(type_=String(50))
    is_delete=Column(type_=Boolean)
    tag1=Column(Enum('PYTHON','FLASK','DJANGO'))    #枚举常规写法
    tag2=Column(Enum(TagEnum))                      #枚举的另一种写法,但是需要定义一个类,类中定义一些需要的属性
    create_time1=Column(type_=Date)
    create_time2=Column(type_=DateTime)
    create_time3=Column(type_=Time)
    content1=Column(type_=Text)
    content2=Column(type_=LONGTEXT)

#根据模型类生成数据表
Base.metadata.create_all()

三、Column常用参数

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

案例

import enum
from sqlalchemy import create_engine,Column,Integer,String,TEXT,Boolean,Float,DECIMAL,DATE,Date,DateTime,Time,Text
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime
# 数据库的配置变量
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'test'
USERNAME = 'root'
PASSWORD = 'root'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)

#创建数据库引擎
engine=create_engine(DB_URI)


#创建基类
Base=declarative_base(engine)

class New(Base):
    __tablename__='t_news1'
    id = Column(Integer, primary_key=True, autoincrement=True) #自增主键
    create_time = Column(DateTime,default=11)                  #设置某个字段的默认值。在发表时间这些字段上面经常用。
    title = Column(String(50), name='my_title', nullable=False) #指定某个字段是否为空。nullable=False,表示不能为空
    telephone = Column(String(11), unique=True)                 #指定某个字段的值是否唯一。unique=True:表示唯一
    update_time = Column(DateTime, onupdate=datetime.now, default=datetime.now) #在数据更新的时候会调用这个参数指定的值或者函数。在第一次插入这条数据的时候

Base.metadata.create_all()
#Base.metadata.drop_all()

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值