赞
踩
创建一个类,一个类对应了一个数据库中的一张表,类的数据属性对应了表中的字段名,这个类称为映射类。
使用Declarative系统映射的类是根据基类定义的,换句话说每个映射类需要继承这个基类。我们使用declarative_base() 函数可以创建这个基类,
from sqlalchemy.ext.declarative import declarative_base
#创建数据库引擎
engine=create_engine(DB_URI)
#创建基类
Base=declarative_base(engine)
注意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()
将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了。
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()
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中的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()
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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。