(转)python之sqlalchemy详解
原文:https://zhuanlan.zhihu.com/p/71134861
ps = session.query(Person).first()
print(ps)
# 3、修改制定行数据
person = session.query(Person).first()
print(person)
# 修改表数据,对象.属性 = ' '
person.name = 'hahaha'
# 别忘记要提交哦~
session.commit()
# 4、删除表数据
person = session.query(Person).get(3)
print(person)
session.delete(person)
session.commit()
Column常用数据类型
常用的数据类型,一共是有11个。
注:在SQLAlchemy中不存在double数据类型,使用DECIMAL类型替代
让我们来分别看下这11个数据类型都有哪些?
- Integer:整型,映射到数据库中是int类型。
- Float:浮点类型,映射到数据库中是float类型。他占据的32位。
浮点类型,有可能会造成精度丢失,特别是在money方面,不可原谅。 - Double(SQLAlchemy中没有,代替品为DECIMAL):双精度浮点类型,映射到数据库中是double类型,占据64位
- String:可变字符类型,映射到数据库中是varchar类型.
- Boolean:布尔类型,映射到数据库中的是tinyint类型。
- DECIMAL:定点类型。是专门为了解决浮点类型精度丢失的问题的。在存储money相关的字段的时候建议大家都使用这个数据类型。并且这个类型使用的时候需要传递两个参数,第一个参数是用来标记这个字段总能能存储多少个数字,第二个参数表示小数点后有多少位。
- Enum:枚举类型。指定某个字段只能是枚举中指定的几个值,不能为其他值。在ORM模型中,使用Enum来作为枚举。
- Date:存储时间,只能存储年月日。映射到数据库中是date类型。在Python代码中,可以使用
datetime.date
来指定。 - DateTime:存储时间,可以存储年月日时分秒毫秒等。映射到数据库中也是datetime类型。在Python代码中,可以使用
datetime.datetime
来指定。 - Time:存储时间,可以存储时分秒。映射到数据库中也是time类型。在Python代码中,可以使用
datetime.time
来指定
ps:注意区分Date/DateTime/Time的储存信息!!! - Text:存储长字符串。一般可以存储6W多个字符
- LONGTEXT:长文本类型,映射到数据库中是longtext类型(不过这个只有mysql有,orcale没有)
上述就是11个数据类型,因为这里把不存在的double也添加上了,所以看起来是12个。
下面就让咱们一起来进行验证。
代码实现
# 依次导入常用的数据类型
from sqlalchemy import create_engine, Column, Integer, String,Float,DECIMAL,Boolean,Date,DateTime,Time,Text,Enum
# 从sqlalchemy的方言模块dialects导入mysql专有的LONGTEXT,长文本类型
from sqlalchemy.dialects.mysql import LONGTEXT
# 在python3.x中有enum模块
import enum
#导入时间了
from datetime import datetime,date,time
# 用`declarative_base`根据`engine`创建一个ORM基类。
from sqlalchemy.ext.declarative import declarative_base
# 引入创建py和数据库连接的sessionmaker函数
from sqlalchemy.orm import sessionmaker
# 准备连接数据库基本信息
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'first_sqlalchemy'
USERNAME = 'root'
PASSWORD = 'root'
DB_URI = 'mysql+pymysql://{username}:{pwd}@{host}:{port}/{db}?charset=utf8' \
.format(username=USERNAME, pwd=PASSWORD, host=HOSTNAME, port=PORT, db=DATABASE)
# 创建数据库引擎
engine = create_engine(DB_URI)
Base = declarative_base(engine)
# 需求:常用的数据类型
# 枚举另外一种写法,导入enum模块,定义枚举类
class TagEnum(enum.Enum):
python = "PYTHON"
flask = 'FLASK'
django = 'DJANGO'
class News(Base):
__tablename__ = 'news'
id = Column(Integer,primary_key=True,autoincrement=True)
price1 = Column(Float) # 不过存储数据时存在精度丢失的问题
price2 = Column(DECIMAL(10,4))
title = Column(String(50))
is_delete = Column(Boolean)
tag1 = Column(Enum('PYTHON','FLASK','DJANGO')) # 枚举的常规写法(推荐)
tag2 = Column(Enum(TagEnum)) # 另一种写法
create_time1 = Column(Date)
create_time2 = Column(DateTime)
create_time3 = Column(Time)
content1 = Column