python+django+mysql(mariaDB)+pycharm配置迁移使用中的一些错误整理
mysql数据库迁移(makemigrations,migrate,check)
1.makemigrations
根据检测到的模型创建新的迁移。迁移的作用,更多的是将数据库的操作,以文件的形式记录下来,方便以后检查、调用、重做等等。
命令:python manage.py makemigrations
会在app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py。
但是 这个改动还没有作用到数据库文件。
2.migrate
使数据库状态与当前模型集和迁移集同步。就是将对数据库的更改,主要是数据表设计的更改,在数据库中真实执行。例如,新建、修改、删除数据表,新增、修改、删除某数据表内的字段等等
命令:python manage.py migrate
此命令应在makemigrations后执行。将更改动作用到数据库。
如何禁用migrate
Django >= 1.9版本时 有这么一个配置项目 MIGRATION_MODULES。 from settings import * MIGRATION_MODULES = { 'auth': None, 'contenttypes': None, 'default': None, 'sessions': None, 'core': None, 'profiles': None, 'snippets': None, 'scaffold_templates': None, 其他Django版本: SOUTH_TESTS_MIGRATE = False
3.check
命令: python manage.py check
检查当前model.py中是否有错误
3.在pycharm中如何使用
第一种方法可以在Terminal中运行上面的命令
第二种方法可以通过tools--run manage.py task.....打开manage.py运行界面,直接运行命令。比如, migrate
mysql的一些报错和异常
1. myql Error Code : 1060 Duplicate column name 'xxx'
有错误的主要原因是数据库中已经含有相应的字段了,但是在你makemigrations的时候还记录了需要增加这个字段(主要是你可能删除过migrations这个文件夹里面的内容)
解决方法:打开当前APP下迁移记录目录migrations下的最新文件,将报重复的这个字段'xxx'从中注销掉。
2.开启binlog后异常:impossible to write to binary log since BINLOG_FORMAT = STATEMENT
原因:mysql默认的binlog_format是STATEMENT。
从 MySQL 5.1.12 开始,可以用以下三种模式来实现:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。相应地,binlog的格式也有三种:STATEMENT,ROW,MIXED。
如果你采用默认隔离级别REPEATABLE-READ,那么建议binlog_format=ROW。如果你是READ-COMMITTED隔离级别,binlog_format=MIXED和binlog_format=ROW效果是一样的,binlog记录的格式都是ROW,对主从复制来说是很安全的参数。
解决方法:
1.手动修改linux下面/etc/my.cnf,或windows中的my.ini: binlog_format = mixed, 然后重启mysql。如果/etc目录下没有my.cnf,可以找找mysql安装目录里面是否有该文件
2.mysql> STOP SLAVE;
Query OK, 0 rows affected (0.02 sec)
mysql> SET GLOBAL binlog_format=MIXED;
Query OK, 0 rows affected (0.00 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
但是这样只会一次性
为了永久生效,需要修改my.ini
# Remove leading
# to turn on a very important data integrity option: logging
# changes to the binary log between backups.
log_bin = E:/mysql56/log_bin/log_bin.log
#relay_log = E:/mysql56/log_bin/relay_log.log
#read_only = 1
# binary logging format - mixed recommended
binlog_format=mixed
3.mysqldump --databases zqswoa....报错Binlogging on server not active的解决
mariaDB: vim /etc/mysql/mariadb.conf.d/50-server.cnf,打开以下两个选项
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
4.migrate时报外键错误:1452, 'Cannot add or update a child row: a foreign key constraint fails
在MYSQL或MARIA中更改外键检查选项为关闭,执行完后可以再打开:
SET FOREIGN_KEY_CHECKS=0;
如果程序运行中进行数据操作时报这个错,可以通过在settings.py中设置外键检查临时解决
# 如果报错1452, 'Cannot add or update a child row: a foreign key constraint fails,可通过关闭外键检查解决
# 'options': {
# "init_command": "SET foreign_key_checks = 0;",
# }
5.mariaDB 10.3的配置文件 /etc/my.cnf.d/server.cnf
mysqldump 导出数据库文件时,出现binloggin on server no active错误的解决方法:
先检查是否开启了binlog SHOW VARIABLES LIKE 'log_bin'; 如果提示: +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | OFF | +---------------+-------+ 1 row in set (0.104 sec) 则需要执行下列步骤: 增加对mariadb的配置,开启binlog: vim /etc/my.cnf.d/server.cnf 在[mysqld]一节中增加下列配置: log-bin=mysql-bin max-binlog-size=1G expire_logs_days=180 #如果启用了这一行,则会使得binlog更大,但是最安全。 binlog_format=row 保存后,重启mariadb服务: systemctl restart mariadb 登录mysql后执行: SHOW VARIABLES LIKE 'log_bin'; 如果提示: +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | +---------------+-------+ 1 row in set (0.002 sec) 则说明binlog开启成功,然后执行: SHOW BINLOG EVENTS; 如果显示数据库操作记录,则说明binlog启用成功。 也可以进入mariadb的data——dir中查看二进制日志文件是否已经产生: cd /home/mariadb/ ll 如果显示类似的文件,则说明binlog成功: mysql-bin.000001 mysql-bin.index