Python——Flask-SQLAlchemy数据库表反向生成model模型
原创
©著作权归作者所有:来自51CTO博客作者ZBY52031的原创作品,请联系作者获取转载授权,否则将追究法律责任
最近Flask项目要根据数据库表生成model,所以报错合集来啦!
import os
def create_models():
db_url = "mysql+pymysql://jxz_user:123456jxz!@localhost:3306/bnh_novel?charset=utf8mb4"
project_path = os.getcwd()
print(project_path)
model_path = os.path.join(project_path, 'models.py')
cmd = 'flask-sqlacodegen --flask {}'.format(db_url)
try:
output = os.popen(cmd)
resp = output.buffer.read().decode(encoding='utf-8')
content = str(resp)
output.close()
# w+ 读写权限
with open(model_path, 'w+', encoding='utf-8') as f:
f.write(content)
print('create models successfully!')
except Exception as e:
print(e)
if __name__ == '__main__':
create_models()
上面就是创建models.py代码。非常简单!然后不注意就会有非常多的报错!以下记录报错信息:
1.记得pip基本数据库连接依赖包!
pip install flask-sqlacodegen
pip install pymysql
pip install flask-sqlalchemy
2.数据库密码注意点!密码主要@符号,因为设置的密码是123456!@#$%^,所以就报错以下信息了:
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on '#$%@localhost' ([Errno 11003] getaddrinfo failed)")
3.代码中os.popen()之后,再read(),可能会报以下错误:
'gbk' codec can't decode byte 0xac in position 298: illegal multibyte sequence
所以这个情况下,可以修改自己代码为:
之前代码是:
output = os.popen(cmd)
content = str(output.read())
修改后代码:
output = os.popen(cmd)
resp = output.buffer.read().decode(encoding='utf-8')
content = str(resp)
str()可以不加没关系
4.最后要output.close(),不然会报错:
OSError: [WinError 6] 句柄无效。
好了,完结啦!
其实中间还出现了
RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
因为我删了这个依赖包也没有重现这个问题,所以就写在最后啦!只需要pip install cryptography就好,这里有个注意点就是版本号(cryptography==2.8),尽量不要最新版本就好
三分钟后......
翻了一下之前的文章,已经写过这个,而且很简单,我就无语了!
1.pip install sqlacodegen
2.cd前往要生成models.py的项目目录下
3.sqlacodegen --outfile models.py "mysql+pymysql://用户:密码@localhost:3306/数据库?charset=utf8mb4"