【SQLAlchemy】第2节:模型类的定义与创建
1. 导包并创建Base类
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,String,Integer
Base = declarative_base()
注:
- declarative_base:用于创建Base类,所有的模型类都要继承Base类,注意Base是没有实例化的类对象
- Column:定义字段
- String,Integer等:定义简单的字段类型
2. 定义Class类
class User(Base):
__tablename__ = 'user'
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(16))
class News(Base):
__tablename__ = 'news'
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(16))
解释:
- __tablename__:模型类对应数据库中的表名,必须填写
- Column:表示定义字段
- 格式:【字段名】 = Column(【字段类型】,【约束】…)
- String(16):varchar(16),Integer:int
注:
- 定义主键的时候,以下两种都可以(中间表的主键必须定义autoincrement=True,普通表定义主键,只定义primary_key=True就可以)
- id = Column(Integer,primary_key=True,autoincrement=True)
- id = Column(Integer,primary_key=True)
3. 创建模型类(在数据库中生成这个User表)
在数据库中创建模型类对应的表有两种方式,但只要与数据库发生交互,就必须要有连接引擎engine
3.1 创建连接引擎
from sqlalchemy import create_engine
engine = create_engine(
'mysql+pymysql://root:12345@localhost:3306/db_sqlalchemy_notebook',
echo=False
)
3.2 创建(第1种方法:创建指定的模型类)
User.metadata.create_all(engine) # 仅仅创建User类
News.metadata.create_all(engine) # 仅仅创建News类
3.3 创建(第2种方法:创建所有继承Base类的模型类)
Base.metadata.create_all(engine) # 这里就相当于一起创建了User类和News类,因为他们都继承了Base类
4. 完整代码总览
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,String,Integer
# 定义连接引擎
engine = create_engine(
'mysql+pymysql://root:12345@localhost:3306/db_sqlalchemy_notebook',
echo=False
)
# 创建模型基类
Base = declarative_base()
# 定义用户表
class User(Base):
__tablename__ = 'user' # User模型类对应数据库中名为user的表
id = Column(Integer,primary_key=True,autoincrement=True) # int类型主键,自增
name = Column(String(16)) # varchar(16)
# 定义新闻表
class News(Base):
__tablename__ = 'news'# News模型类对应数据库中名为news的表
id = Column(Integer,primary_key=True,autoincrement=True) # int类型主键,自增
name = Column(String(16)) # varchar(16)
# 两种创建方式,选择其一
# 第一种:
User.metadata.create_all(engine) # 仅仅创建User类
News.metadata.create_all(engine) # 仅仅创建News类
# 第二种
Base.metadata.create_all(engine) # 这里就相当于一起创建了User类和News类,因为他们都继承了Base类