0

mysql データベースを使用するリンク短縮サービス Sinatra アプリケーションをテストしています。短縮するリンクを入力すると、この mysql エラーが発生します

 (mysql_errno=1364, sql_state=HY000) Field 'link_identifier' doesn't have a default value Query: INSERT INTO `urls` (`original`) VALUES ('http://pryrepl.org/screencasts.html')

フィールドlink_identifierにはデフォルト値が必要であることを意味すると思います

URL テーブルと訪問テーブルの両方に link_identifier フィールドがありますが、リンク テーブルにはありません。ただし、以下にコピーしたテーブルを作成するコードでは、「プロパティ :identifier」を持つのは Link クラスです。この問題を解決する方法を知っている人はいますか?

mysql> show columns from urls;
+-----------------+------------------+------+-----+---------+----------------+
| Field           | Type             | Null | Key | Default | Extra          |
+-----------------+------------------+------+-----+---------+----------------+
| id              | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| original        | varchar(255)     | YES  |     | NULL    |                |
| link_identifier | varchar(50)      | NO   | MUL | NULL    |                |
+-----------------+------------------+------+-----+---------+----------------+
3 rows in set (0.12 sec)

mysql> show columns from visits
    -> ;
+-----------------+------------------+------+-----+---------+----------------+
| Field           | Type             | Null | Key | Default | Extra          |
+-----------------+------------------+------+-----+---------+----------------+
| id              | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| created_at      | datetime         | YES  |     | NULL    |                |
| ip              | varchar(39)      | YES  |     | NULL    |                |
| country         | varchar(50)      | YES  |     | NULL    |                |
| link_identifier | varchar(50)      | NO   | MUL | NULL    |                |
+-----------------+------------------+------+-----+---------+----------------+
5 rows in set (0.08 sec)

mysql> show columns from links
    -> ;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| identifier | varchar(50) | NO   | PRI | NULL    |       |
| created_at | datetime    | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

コード

class Url
  include DataMapper::Resource
  property  :id,          Serial
  property  :original,    String, :length => 255   
  belongs_to  :link
end
....

class Link
  include DataMapper::Resource
  property  :identifier,  String, :key => true
  property  :created_at,  DateTime 
  has 1, :url
  has n, :visits

...

class Visit
  include DataMapper::Resource

  property  :id,          Serial
  property  :created_at,  DateTime
  property  :ip,          IPAddress
  property  :country,     String
  belongs_to  :link

  after :create, :set_country

....

更新 - ソース コードには、mysql の要件を満たすリンク識別子を作成する方法が既にあるようですが、機能していないようです。

def self.create_link(original)
    url = Url.create(:original => original)
    if Link.first(:identifier => url.id.to_s(36)).nil? or !DIRTY_WORDS.include? url.id.to_s(36)
      link = Link.new(:identifier => url.id.to_s(36))
      link.url = url
      link.save 
      return link     
    else
      create_link(original)
    end    
  end
end
4

2 に答える 2

0

このエラーはlink_identifier、insert ステートメントで値を設定していないことを意味します。また、テーブル定義link_identifierではできません。null

の値を指定する必要がありますlink_identifier。例

INSERT INTO `urls` (`original`, `link_identifier`) 
VALUES ('http://pryrepl.org/screencasts.html', 'value_for_link_identifier')
于 2012-10-05T18:11:00.003 に答える
0

クエリ送信時

 INSERT INTO `urls` (`original`) VALUES ('http://pryrepl.org/screencasts.html')

の値link_identifierが設定されていません。

URL テーブルを次のように定義しました。

mysql> show columns from urls;
+-----------------+------------------+------+-----+---------+----------------+
| Field           | Type             | Null | Key | Default | Extra          |
+-----------------+------------------+------+-----+---------+----------------+
| id              | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| original        | varchar(255)     | YES  |     | NULL    |                |
| link_identifier | varchar(50)      | NO   | MUL | NULL    |                |
+-----------------+------------------+------+-----+---------+----------------+
3 rows in set (0.12 sec)

link_identifier のデフォルト値は NULL (または未設定) ですが、値を NULL にすることはできないため、mysql は何を値として設定すればよいかわかりません。

mysql クエリを次のように変更します。

 INSERT INTO `urls` (`original`, `link_identifier`) VALUES ('http://pryrepl.org/screencasts.html', '<your identifier here>')
于 2012-10-05T18:11:35.827 に答える