您的位置:首页 > 数据库

Django中因为不同项目操作同一数据库同一应用表出现的迁移问题

2020-03-28 20:04 691 查看

原因:在学习Django过程中,第一阶段创建了第一个项目test1,创建了数据库(bj18)和应用(booktest)
在第二阶段重新创建了第二个项目test2,使用了同样名字的数据库和同样名字的应用
导致在迁移文件时出现了一些情况:
迁移时出错(无错误信息,只是显示):

No migrations to apply
,是因为数据库中django_migrations有记录了
如:两天前的上一个项目我创建了一个app叫booktest的0001_initial文件,
今天的新项目我又想迁移同样的app(booktest)同样的0001_initial,而且还是同样的数据库(bj18)
然而django判断已经有了这个记录,所以跳过生成数据库的过程,所以才会导致No migrations to apply

解决办法:删除django_migrations中对应的记录即可(千万不要错删其他条,不然可能造成不可逆操作,一堆报错)今天因为没有搞懂,误把django_migrations这个表删除了,结果一发不可收拾,一堆报错,导致要全部清空虚拟环境数据库(即bj18这个数据库)中的所有表才能重新生成,但是以前的app数据库里面的数据要一一备份,重新导入,搞得很麻烦,但也顺便学习了数据库的备份方式。

迁移时报错,说BookInfo already exits ,那是因为以前的项目已经创建了这个数据库,只需在迁移文件0001_initial.py中删除对应的

migrations.CreateModel(BookInfo)
,再直接执行migrate即可。执行完后,它还会提示你说你的0001_initial.py中没有bookinfo,heroinfo等数据表,问你要不要删除(yes/no)
这是因为这些表是我以前的项目中创建在这个数据库中的,这里我选择不想删除,选择保留,所以填no

下面是备份数据库的一些过程:

本次备份数据库的方法是使用into outfile 和 load data infile导入导出备份数据
初次导出时遇到错误:

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement.

原因:mysql默认规定数据库导入导出有目录限制,只能从规定目录中导入导出

查看官方文档,

secure_file_priv
参数用于限制LOAD DATA, SELECT …OUTFILE, LOAD_FILE()传到哪个指定目录。
secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。
secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能执行。
secure_file_priv 没有值时,表示不限制mysqld在任意目录的导入导出。
执行:
show variables like '%secure%';

得到:

说明我们只能导出到/var/lib/mysql-files/这个目录下面
顺带一提,据说我们安装完mysql后会自动生成一个
my.ini
文件,secure_file_priv可以在这里面配置
里面规定了MySQL 的所有默认配置,如端口号、默认字符集、默认存储引擎等等。
而该文件位于数据库的存储地方,且为隐藏文件
这里又引申出了如何查找mysql数据库所有文件的存储位置
执行:
show global variables like "%datadir%";

结果:

进入该目录,发现权限不够,输入su回车,输入密码,进入成功
执行ls -a,结果并未找到类似文件,目前原因不明

因此目前无法自定义secure_file_priv,只能老老实实导出到/var/lib/mysql-files/这里面去

导出(备份,这里是一个表导出到一个文件里,对必要备份的表一一导出(本次我需要备份数据的表只要三个)):

select * from booktest where status!=0 and name!='' into outfile '/var/lib/mysql-files/booktest'
fields terminated by '|' enclosed by '"' lines terminated by '\r\n' ;

其中第二行省略也能导出成功,注意导出后文件里面数据存储方式的区别
导入到数据库的新表中(原表已删除,新表是通过迁移文件生成的,表结构完全一样,无数据):

load data infile '/var/lib/mysql-files/booktest' into table mytable_bak
fields terminated by '|' enclosed by '"' lines terminated by '\r\n' ;

完成

  • 点赞
  • 收藏
  • 分享
  • 文章举报
土豆大番薯 发布了8 篇原创文章 · 获赞 0 · 访问量 217 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐