携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情
利用数据库中的表反向生成python中的实体类
要求python环境为3.8,3.7没有测试,3.6会报错如下内容:
/root/pyenv/lib/python3.6/site-packages/pymysql/_auth.py:8: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography and will be removed in a future release.
from cryptography.hazmat.backends import default_backend
1.进入到虚拟环境中,安装相应的依赖
pip3 install flask-sqlacodegen
pip3 install PyMySQL
2.直接在虚拟环境中运行如下命令即可生成
- 生成单表,是一张表生成一个py文件,一个文件一个类
flask-sqlacodegen "mysql+pymysql://root:123456@ip:端口/数据库名" --tables 表名 --outfile "user.py" --flask
生成之后如下所示:
# coding: utf-8
from flask_sqlalchemy import SQLAlchemy
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(32), info='用户名')
password = db.Column(db.String(32), info='密码')
- 生成多表,多个表的类在一个py文件中
flask-sqlacodegen "mysql+pymysql://root:123456@ip:端口/数据库名" --tables 表1名,表2名 --outfile "user.py" --flask
- 将数据库中的所有表都生成,此种生成方法所有类都在一个py文件中
flask-sqlacodegen "mysql+pymysql://root:123456@ip:端口/数据库名" --outfile "user.py" --flask
生成之后结果展示如下:
# coding: utf-8
from flask_sqlalchemy import SQLAlchemy
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(32), info='用户名')
password = db.Column(db.String(32), info='密码')
class Students(db.Model):
__tablename__ = 'students'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), info='学生姓名')
stu_number = db.Column(db.String(16), info='学号')
其他注意事项
1.flask-sqlacodegen版本问题
旧版不会将comment的信息展示出来,最新版的flask-sqlacodegen可以将数据库表中每一行的的各种描述也展示出来,具体展示用上面的info来表示,若出现info后的内容都为问号的情况下,即为编码格式的问题,需要在上面的命令上加上编码charset=utf8mb4,具体如下:
flask-sqlacodegen "mysql+pymysql://root:123456@ip:端口/数据库名?charset=utf8mb4" --tables 表名 --outfile "user.py" --flask
2.flask-sqlacodegen和sqlacodegen问题
这两个依赖只能选择一个安装并使用,否则会报错,卸载掉一个即可
pip uninstall sqlacodegen
3.数据库中的表若没有设置主键,生成的py文件则是一个表的形式而不是类,具体表现如下:
# coding: utf-8
from sqlalchemy import Column, Float, String, Table
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
t_traffic = db.Table(
'traffic',
db.Column('trafficID', db.String(12)),
db.Column('roadName', db.String(12)),
db.Column('length', db.String(12)),
db.Column('station', db.Float),
)