将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 Person(Base): __tablename__ = 'person'
3. 创建属性来映射到表中的字段,所有需要映射到表中的属性都应该为Column类型:
class Person(Base): __tablename__ = 'person' # 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()`将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了。
用session做数据的增删改查操作
1. 构建session对象:
所有和数据库的ORM操作都必须通过一个叫做`session`的会话对象来实现,通过以下代码来获取会话对象:
from sqlalchemy.orm import sessionmaker engine = create_engine(DB_URI) session = sessionmaker(engine)()
2. 添加对象:
* 创建对象,添加一条或者多条
class Person(Base): __tablename__ = 'person' id = Column(Integer,primary_key=True,autoincrement=True) name = Column(String(50)) age = Column(Integer) country = Column(String(50)) def __str__(self): return "<Person(name:%s,age:%s,country:%s)>" % (self.name,self.age,self.country) # session:会话 # 增 p1 = Person(name='wqbin',age=24,country='china') p2 = Person(name='wang',age=25,country='china') p3 = Person(name='wangpi',age=26,country='china') session.add(p1) session.add_all([p2,p2]) session.commit()
3. 查找对象:
# 查找某个模型对应的那个表中所有的数据:
all_person = session.query(Person).all()
# 使用filter_by来做条件查询
all_person = session.query(Person).filter_by(name='wqbin').all()
# 使用filter来做条件查询
all_person = session.query(Person).filter(Person.name=='wqbin').all()
# 使用get方法查找数据,get方法是根据id来查找的,只会返回一条数据或者None
person = session.query(Person).get(primary_key)
# 使用first方法获取结果集中的第一条数据
person = session.query(Person).first()
4. 修改对象
首先从数据库中查找对象,然后将这条数据修改为你想要的数据,最后做commit操作就可以修改数据了。
person = session.query(Person).first() person.name = 'wqbin123' session.commit()
5. 删除对象
将需要删除的数据从数据库中查找出来,然后使用`session.delete`方法将这条数据从session中删除,最后做commit操作就可以了。
person = session.query(Person).first()
session.delete(person)
session.commit()
sqlalchemy常用数据类型:
- Integer:整形=INIT=INTEGER
- Float:浮点类型占据32位。
- Double:双精度浮点类型,映射到数据库中是double类型,占据64位。
- Boolean:传递True/False进去
- decimal:定点类型,为解决浮点型丢失数据精度
- enum:枚举类型
- Date:传递 datetime.date()进去
- DateTime:传递datetime.datetime()进去
- Time:传递Datetime.time()进去
- String:字符类型,使用时需要指定长度,区别于Text类型
- Text:文本类型
- LONGTEXT:长文本类型
from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text from sqlalchemy.dialects.mysql import LONGTEXT from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 在Python3中才有这个enum模块,在python2中没有 import enum HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'flask' USERNAME = 'root' PASSWORD = 'root' # dialect+driver://username:password@host:port/database DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE) engine = create_engine(DB_URI) Base = declarative_base(engine) session = sessionmaker(engine)() class TagEnum(enum.Enum): python = "python" flask = "flask" django = "django" class Article(Base): __tablename__ = 'article' id = Column(Integer,primary_key=True,autoincrement=True) price1= Column(Float) is_delete = Column(Boolean) price2 = Column(DECIMAL(10,4)) # 100000.0001 tag = Column(Enum(TagEnum)) create_time1 = Column(Date) create_time2 = Column(DateTime) create_time3 = Column(Time) title = Column(String(50)) content1 = Column(Text) content2 = Column(LONGTEXT) # alembic # flask-migrate Base.metadata.drop_all() Base.metadata.create_all() from datetime import date from datetime import datetime from datetime import time article = Article(price1=100000.99999,price2=100000.99999, create_time1=date.today(),create_time2=datetime.now(),create_time3=time()) session.add(article) session.commit()