SQLAlchemy系列之数据表的创建和删除
以本地MySQL的test数据库为例,先来看一下test数据库的表情形:
现在使用SQLAlchemy创建一个worker的表,代码如下:
1.数据表的创建
1 .1创建方法一
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, DateTime
Base = declarative_base()
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test?charset=utf8', echo=True)
class Worker(Base):
# 表名
__tablename__ = 'worker'
id = Column(Integer, primary_key=True)
name = Column(String(50), unique=True)
age = Column(Integer)
birth = Column(DateTime)
part_name = Column(String(50))
# 创建数据表
Base.metadata.create_all(engine)
我们再来看看数据库,是否真的创建成功了
我们对比前后两次数据库的查询信息,确实新生成了一张名叫worker的表。
该方法引入declarative_base模块,生成其对象Base,再创建一个类Worker。一般情况下,数据表名和类名是一致的。tablename用于定义数据表的名称,可以忽略,忽略时默认定义类名为数据表名。然后创建字段id、name、age、birth、part_name,最后使用Base.metadata.create_all(engine)在数据库中创建对应的数据表
1.2 创建方法二
Base.metadata.create_all(engine)
from sqlalchemy import create_engine
from sqlalchemy.dialects.mysql import INTEGER,CHAR
from sqlalchemy import Column, MetaData, ForeignKey, Table
meta = MetaData()
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test?charset=utf8', echo=True)
part = Table("part", meta,
Column('id', INTEGER, primary_key=True),
Column('part_name', CHAR(50), ForeignKey(Worker.name)),
Column('part_no', INTEGER)
)
part.create(bind=engine)
再来看看数据库的情形
我们对比前后两次数据库的查询信息,确实新生成了一张名叫part的表。该方法与前面介绍的创建数据表的方法差别很大,代码偏向于SQL创建数据表的语法,两者引入的模块不一样,这也导致了创建语法的不同。
在数据表存在时,再去创建数据表方法一不会报错,二方法二会报错。
2.数据表的删除
删除数据表的时候,一定要先删除设有外键的数据表,也就是先删除part,然后才能删除worker,两者之间涉及外键,这是在数据库中删除数据表的规则。对于两种不同方式创建的数据表,删除语句也不一样。
第一种方式创建的数据库表
Base.metadata.drop_all(engine)
第二种方式创建的数据库表
part.drop(bind=engine)
删除前的数据库情形:
删除数据库表:
part.drop(bind=engine)
Base.metadata.drop_all(engine)
来看看数据库的结果:
注: 无论数据库表是否已经创建,在使用SQLAlchemy时都必须要对数据表的属性、字段进行类定义。也就是说,无论通过什么方式创建数据表,在使用SQLAlchemy时,第一步是创建数据库连接,第二步是定义类来映射数据表,类的属性映射数据表的字段。
转载自:https://juejin.cn/post/7014371642545537037