创建一个类,一个类对应了一个数据库中的一张表,类的数据属性对应了表中的字段名,这个类称为映射类。
一、主动创建映射
使用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()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123410.html