Django创建数据表

时间:2022-10-15 14:34:43

Django中,我们使用models来定义表,并且尽量不要跳过Django手动操作数据表。

 参考:http://python.usyiyi.cn/translate/django_182/intro/tutorial01.html

 

models.py中每个模型相当于一个数据库表,每个属性代表一个字段,属性名就是字段名。字段类型CharField相当于SQL中varchar类型,IntegerField相当于SQL中int类型。

 

models.py:

 
  1. #机柜
  2. class cabinet(models.Model):
  3.     name = models.CharField('名称',max_length=30)
  4.     power = models.CharField('权限',max_length=20)
  5.     class Meta:
  6.         db_table = "cabinet"
  7.         
  8. #服务器
  9. class server(models.Model):
  10.     int_ip = models.CharField('内网IP地址',max_length=50)
  11.     ext_ip = models.CharField('外网IP地址', max_length=50)
  12.     mac_address = models.CharField('MAC地址',max_length=50)
  13.     hostname = models.CharField('主机名',max_length=50)
  14.     os = models.CharField('系统',max_length=50)
  15.     status = models.IntegerField('状态')
  16.     gateway = models.CharField('网关',max_length=50)
  17.     cpu_model = models.CharField('CPU型号',max_length=100)
  18.     cpu_thread_number = models.PositiveIntegerField('CPU线程数')
  19.     server_disk = models.CharField('磁盘',max_length=20)
  20.     server_mum = models.IntegerField('内存')
  21.     manufacture_date = models.DateField('生产日期')
  22.     manufacturers = models.CharField('生产商',max_length=30)
  23.     cabinet_id = models.IntegerField('机柜ID')
  24.     server_run = models.CharField('运行的服务',max_length=30)
  25.     class Meta:
  26.         db_table = "server"
  27.  
  28. #服务列表
  29. class product(models.Model):
  30.     service_name = models.CharField('服务名称',max_length=20)
  31.     pid = models.IntegerField('pid')
  32.     module_letter = models.CharField(max_length=10)
  33.     class Meta:
  34.         db_table = "product"

 

通过运行makemigrations告诉Django,已经对模型做了一些更改(在这个例子中,你创建了一个新的模型)并且会将这些更改记录为迁移文件。

 
  1. E:\DjangoWeb>python manage.py makemigrations
  2. Migrations for 'webserver':
  3.  webserver\migrations\0002_cabinet_product_server.py
  4.  - Create model cabinet
  5.  - Create model product
  6.  - Create model server​

 

迁移是 Django 如何储存模型的变化(以及您的数据库模式),它们只是磁盘上的文件。如果愿意,你可以阅读这些为新模型建立的迁移文件;这个迁移文件就是  polls/migrations/0001_initial.py不用担心,Django不要求你在每次Django生成迁移文件之后都要阅读这些文件,但是它们被设计成可人为编辑的形式,以便你可以手工稍微修改一下Django的某些具体行为。

 

 

sqlmigrate命令接收迁移文件的名字并返回它们的SQL语句,我们可以检查SQL语句是否与我们的初衷相符:

注意:在旧版本中用sqlall来查看Django会执行的SQL语句,新版本中sqlmigrate是最接近sqlall功能的,但并不等价。

 
  1. E:\DjangoWeb>python manage.py sqlmigrate webserver 0002
  2. BEGIN;
  3. --
  4. -- Create model cabinet
  5. --
  6. CREATE TABLE `cabinet` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(30) NOT NULL, `power` varchar(20) NOT NULL);
  7. --
  8. -- Create model product
  9. --
  10. CREATE TABLE `product` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `service_name` varchar(20) NOT NULL, `pid` integer NOT NULL, `module_letter` varchar(10) NOT NULL);
  11. --
  12. -- Create model server
  13. --
  14. CREATE TABLE `server` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `int_ip` varchar(50) NOT NULL, `ext_ip` varchar(50) NOT NULL, `mac_address` varchar(50) NOT NULL, `hostname` varchar(50) NOT NULL, `os` varchar(50) NOT NULL, `status` integer NOT NULL, `gateway` varchar(50) NOT NULL, `cpu_model` var
  15. char(100) NOT NULL, `cpu_thread_number` integer UNSIGNED NOT NULL, `server_disk` varchar(20) NOT NULL, `server_mum` integer NOT NULL, `manufacture_date` date NOT NULL, `manufacturers` varchar(30) NOT NULL, `cabinet_id` integer NOT NULL, `server_run` varchar(30) NOT NULL);
  16. COMMIT;

 

如果SQL正确,那么运行迁移来在数据库中创建这个表:

 
  1. E:\DjangoWeb>python manage.py migrate
  2. Operations to perform:
  3.   Apply all migrations: admin, auth, contenttypes, sessions, sites, webserver
  4. Running migrations:
  5.   Applying webserver.0002_cabinet_product_server... OK

 

 检查数据库是否创建成功:

Django创建数据表

Django创建数据表

Django创建数据表


请注意以下几点:

  • 输出的具体内容会依据你使用的数据库而不同。 以上例子使用的数据库是MySQL。
  • 表名是自动生成的,由app的名字(polls)和模型名字的小写字母组合而成 —— questionchoice(你可以重写这个行为。)
  • 主键(id)是自动添加的。(你也可以重写这个行为。)
  • 按照惯例,Django会在外键的字段名后面添加 "_id"。(是的,你依然可以重写这个行为。)
  • 外键关系由FOREIGN KEY约束显式声明。不用在意DEFERRABLE部分;它只是告诉PostgreSQL直到事务的最后再执行外键关联。
  • 这些SQL语句是针对你所使用的数据库定制的,所以会为你自动处理某些数据库所特有的字段例如auto_increment (MySQL)、 serial (PostgreSQL)或integer primary key autoincrement (SQLite) 。在处理字段名的引号时也是如此 —— 例如,使用双引号还是单引号。
  • sqlmigrate命令并不会在你的数据库上真正运行迁移文件 —— 它只是把Django 认为需要的SQL打印在屏幕上以让你能够看到。 这对于检查Django将要进行的数据库操作或者你的数据库管理员需要这些SQL脚本是非常有用的。

如果有兴趣,你还可以运行python manage.py check它会检查你的项目中的模型是否存在问题,而不用执行迁移或者接触数据库。