email = db.Column(db.String(120), unique=True)
password = db.Column(db.String(127), nullable=False)
OK,到了这里,所有的sqlalchemy
工作就算做完了,下面开始测试工作。
下面就用Flask Shell
完成数据库中表的创建工作,测试代码正确性。
首先使用Ctrl+C
停下正在运行的Flask
服务,然后在命令行中输入:
(venv)~/ahoh$ flask shell # 启动Flask Shell
Python 3.8.10 (default, Nov 26 2021, 20:14:08)
[GCC 9.3.0] on linux
App: app [production]
Instance: /home/wei/ahoh/instance
# 出现命令提示符表示成功启动
Flask Shell
和Python
可交互编程环境差不多,我们不做深究,直接开始。
在Shell
中输入以下代码:
from app import db # 引入db变量
db.create_all() # 创建所有的表
以上指令,就会创建所有继承了db.Model
的类对应的表了,如果在输入db.create_all()
后没有任何输出(没有报错信息),大概率就是成功了。
然后,新开一个终端,进入Mysql
查看ahoh
数据库中是否真的创建了表:
mysql> use ahoh;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
±---------------+
| Tables_in_ahoh |
±---------------+
| t_users |
±---------------+
1 row in set (0.00 sec)
mysql>
还可以使用 DESC
指令查看表的结构:
mysql> desc t_users;
±---------±-------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±---------±-------------±-----±----±--------±---------------+
| id | int | NO | PRI | NULL | auto_increment |
| username | varchar(80) | NO | UNI | NULL | |
| email | varchar(120) | YES | UNI | NULL | |
| password | varchar(127) | NO | | NULL | |
±---------±-------------±-----±----±--------±---------------+
4 rows in set (0.00 sec)
mysql>
建表工作这里就完成了,下面测试数据表的增删改查。
回到Flask Shell
,输入以下指令,向t_users
表中插入数据:
from app import User # 引入User类
u = User(username=‘xiaoming’,email=‘123@123.com’,password=‘123456’) # 创建User实例
db.session.add(u) # 向数据库添加新数据
db.session.commit() # 提交
如果执行以上指令之后,没有报错信息,就厉害大发了。
赶快回到Mysql
查看一下t_users
表里面到底有没有数据,使用以下指令:
mysql> select * from t_users; # 查询表中所有数据
±—±---------±------------±---------+
| id | username | email | password |
±—±---------±------------±---------+
| 1 | xiaoming | 123@123.com | 123456 |
±—±---------±------------±---------+
1 row in set (0.00 sec)
输出和我一样就证明没有问题了!
提醒:密码明文存储是非常愚蠢的行为,这里仅供展示使用,后面会使用加密手段
这也是为什么密码列预留空间很大的原因,你发现了吗
只有一条数据肯定不像话,多加几条:
u1 = User(username=‘aaa’,password=‘bbb’,email=“123@qwe.com”)
u2 = User(username=‘eee’,password=‘bbb’,email=“qwe@qwe.com”)
db.session.add(u1)
db.session.add(u2)
db.session.commit()
然后测试删、改功能:
删除测试
u = User.query.filter_by(username=‘aaa’).first() # 查询
u.username
‘aaa’
db.session.delete(u) # 删除
db.session.commit()
修改测试
u = User.query.filter_by(username=‘xiaoming’).first()
u.username
‘xiaoming’
u.username=‘老天爷’
db.session.add(u)
db.session.commit()
现在数据库和Flask-SQLAlchemy
插件都配置好了,新问题又来了。
我现在对数据表不满意,因为没有年龄age
字段,而且我希望最终建立的数据库有很多表,和现在差距肯定非常大。
所以我需要不断的修改db.Model
的子类,如何在每次修改对象类后,将改动同步到数据库呢?
这就需要Flask-Migrate
插件了,首先,老规矩,安装插件:
(venv) ~/ahoh$ pip install flask-migrate
接下来就是配置Flask-Migrate
插件,非常简单,先在app.py
文件头部导入:
from flask_migrate import Migrate
然后在db=SQLAlchemy(app)
后创建migrate
实例:
migrate = Migrate(app, db)
这样就配置完成了。
Flask-Migrate
的使用也很方便,包括三条命令
首先就是初始化命令:flask db init
在首次安装Flask-Migrate
插件后,需要执行一次,后面就不需要了。
我们先初始化:
(venv) ~/ahoh$ flask db init
Creating directory /home/wei/ahoh/migrations … done
Creating directory /home/wei/ahoh/migrations/versions … done
Generating /home/wei/ahoh/migrations/script.py.mako … done
Generating /home/wei/ahoh/migrations/env.py … done
Generating /home/wei/ahoh/migrations/alembic.ini … done
Generating /home/wei/ahoh/migrations/README … done
Please edit configuration/connection/logging settings in ‘/home/wei/ahoh/migrations/alembic.ini’ before
proceeding.
如果你的输出和我一样,就算成功了。
注意:这些命令都是直接在命令行执行的,并不是在
Flask Shell
下,别搞错了哦!
接下来迁移命令:flask db migrate
(venv) ~/ahoh$ flask db migrate
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.env] No changes in schema detected.
最后是升级命令: flask db upgrade
(venv) ~/ahoh$ flask db upgrade
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
到此为止,Flask-Migrate
的前期准备工作就完成了,接下来就可以修改数据库了。
修改数据库,首先要修改表对应的类,这里我就在User
类中添加一个age
属性:
age = db.Column(db.Integer)
然后在命令行中输入命令flask db migrate
(venv) ~/ahoh$ flask db migrate
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected added column ‘t_users.age’
Generating /home/wei/ahoh/migrations/versions/835faba58af3_.py … done
最后,执行升级命令flask db upgrade
(venv) ~/ahoh$ flask db upgrade
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> 835faba58af3, empty message
如果和我一样没有什么错,就算是成功了,下面就去Mysql
中查看下:
mysql> desc t_users;
±---------±-------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±---------±-------------±-----±----±--------±---------------+
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
五、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!