Не ноль, но все еще получение "Поле 'date' не имеет значения по умолчанию" - PullRequest
0 голосов
/ 30 сентября 2018

Я создаю date_field форму в Rails 5.2.1 + MySQL 5.7.23 и получаю сообщение об ошибке «Поле« дата »не имеет значения по умолчанию».
Я сделал несколькоПогуглил и я понимаю, что мы получаем эту ошибку на MySQL 5.6+ всякий раз, когда пытаемся вставить ноль в столбец без значения по умолчанию.Однако в моем случае я выбираю дату, которая делает ее ненулевой, и я все еще получаю ту же ошибку.

my new.erb:

<%= form_for @post, :url => {:action => :create} do |f| %>
  <table>
    <tr>
      <th>DATE</th>
      <th>CONTENT</th>
    </tr>
    <tr>
      <td><%= f.date_field :date %></td>
      <td><%= f.text_field :content %></td>
    </tr>
  </table>
  <%= f.submit %>
<% end %>

my posts_controller.rb:

class PostsController < ApplicationController

  def new
    @post = Post.new
  end

  def create
    @post = Post.new(user_id: current_user.id, date: params[:date], content: params[:content])
    @post.save
    redirect_to('/')
  end

end

мои настройки MySQL:

CREATE TABLE `posts` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `date` date NOT NULL,
  `content` varchar(255) DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Что я могу сделать, чтобы это исправить?Мы ценим любые предложения.Спасибо.

1 Ответ

0 голосов
/ 30 сентября 2018

Это вызвано режимом STRICT_TRANS_TABLES MySQL.С Документация по MySQL 5.7 :

Строгий режим контролирует, как MySQL обрабатывает недопустимые или отсутствующие значения в операторах изменения данных, таких как INSERT или UPDATE.Значение может быть недействительным по нескольким причинам.Например, он может иметь неправильный тип данных для столбца или может быть вне диапазона.Значение отсутствует, если новая вставляемая строка не содержит значения для столбца, отличного от NULL, который не имеет явного предложения DEFAULT в своем определении.(Для столбца NULL NULL вставляется, если значение отсутствует.) Строгий режим также влияет на операторы DDL, такие как CREATE TABLE.

Если строгий режим не действует, MySQL вставляет скорректированные значения для недопустимых или отсутствующих значений.и выдает предупреждения (см. Раздел 13.7.5.40, «Синтаксис ПОКАЗАТЬ ПРЕДУПРЕЖДЕНИЯ»).В строгом режиме вы можете создать это поведение, используя INSERT IGNORE или UPDATE IGNORE.

Для операторов типа SELECT, которые не изменяют данные, недопустимые значения генерируют предупреждение в строгом режиме, а не ошибку.

Чтобы проверить, включен ли режим STRICT_TRANS_TABLES, выполните следующий запрос:

SHOW VARIABLES LIKE 'sql_mode';

Чтобы отключить строгий режим, вызовите следующий запрос после подключения к базе данных (в вашем приложениикод):

SET GLOBAL sql_mode='';

ИЛИ

SET sql_mode='';

GLOBAL требует привилегий суперпользователя, и это гарантирует, что изменение будет применено ко всем клиентам, подключающимся к серверу.Однако обратите внимание , что метод SET GLOBAL не сделает изменения постоянными.Он будет работать только до тех пор, пока сервер MySQL не будет перезапущен.Чтобы сделать изменения постоянными, вам нужно будет внести изменения в mysqld конфигурационные файлы.В более старых версиях MySQL на сервере (ах) Linux (например, для Ubuntu) существует один файл конфигурации /etc/mysql/mysql.cnf, в который вы добавляете эти изменения ниже подраздела [mysqld].

В более новых версиях, например, для сервера Ubuntu, файл будет выглядеть так: /etc/mysql/mysql.conf.d/mysqld.cnf

Хотя вам действительно следует установить значения по умолчанию для столбцов таблицы.В случае этих полей даты вы можете установить значение по умолчанию null:

CREATE TABLE `posts` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NUL,
  `date` date DEFAULT NULL,
  `content` varchar(255) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...