创建表
打开model.py,在里面写上如下代码:
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField()
其中类的形参model.Model是固定的。整个类会在底层被翻译成一段sql语句,其中创建的表名是app名_类名的小写,在这即是app01_userinfo,且会自动添加一句id bigint auto_increment primary_key
create table app01_userinfo(
id bigint auto_increment primary_key,
name varchar(32),
password varchar(64),
age int
)
整体操作截图:
然后在pycharm的终端里前后执行以下两个命令:
python manage.py makemigrations
python manage.py migrate
此时查看gx_day15下是否有新建表,可通过cmd或者navicate进行查询。
注意,gx_day15下还有很多其他的表。这些表其实是Django框架自带的,暂时可以不用管,后续如果真的不想要的话,可以去将settings.py里的INSTALLED APP的相应字段注释掉。
至此,创建表成功。
修改表
增加表、删除表,删除表中字段,orm操作起来都很方便。
增加表,则是在models.py里写对应的class,随后执行步骤一。
删除表,则是在models.py里将对应的class注释掉。随后执行步骤一。
删除表中字段,则是在models.py中对应的class对应的字段注释掉。随后执行步骤一。
(步骤一是指在pycharm的终端里先后执行python manage.py makemigrations和python manage.py migrate)
但是增加表中字段,需要额外注意。譬如此刻我们想往userinfo里增加一个int类型的stu_id
在models.py中增加stu_id = models.IntegerField()后,执行步骤一,发现出现以下内容
翻译过来是:
在不指定默认值的情况下,无法将不可为null的字段“stu_id”添加到userinfo。这是因为数据库需要一些东西来填充现有的行。
请选择一个修复程序:
1) 立即提供一次性默认值(将在该列具有null值的所有现有行上设置)
2) 退出并在models.py中手动定义默认值。
选择一个选项:
实际这就是orm框架为了严谨,想用一个值覆盖新增字段在原来的表的空间的值。
(譬如,原来的表只有id、name、password、age四个字段,但是空间不止这四个字段。假设新增字段会占据原来空间中的b空间,那么我们无法知道b空间原本是否存储着非法字符。如果此时用一个值覆盖掉b空间的所有值,则利于保证我们后续新增字段,访问b空间时的安全性)。
如果选1,他会出现以下信息:
只用看第一行“Please enter the default value as valid Python.”就好了,其中文是指“请输入默认值让Python有效。” ,于是我们输入有效的默认值,如5。
可以发现,他说“Add field stu_id to userinfo”,实际上就是成功添加字段的意思。随后正常执行migrate命令即可。打开cmd查看表结构,发现确实多了一个字段stu_id。
接下来我们增加一个tea_id = models.IntegerField(),用来测试选2的效果。
如果选2,他会直接退出,不执行python manage.py makemigrations。因为选项2的意思是退出并在models.py中手动定义默认值。
此时我们可以修改代码如下:
再次执行两条命令,发现不会出现选项12的选择了。
查看表结构,发现多了tea_id的字段(此为navicat查看,也可以用cmd查看)