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

 

posted on 2020-07-12 16:23  东门乱弹琴  阅读(829)  评论(0编辑  收藏  举报

导航