错误:在“”“或”“附近的零长度分隔标识符”第1行:删除“区域”WHERE“区域”。“”= $ 1

时间:2014-04-19 02:58:22

标签: postgresql ruby-on-rails-4

我使用Rails 4.1和Postgresql(带PG gem)作为我的数据库。从公司到省份,我有一个非常多的联盟,有一个叫做区域的联接表。现在显然,Regions表没有主键,因为我使用{:id =>假的。但是,当我尝试使用依赖破坏或只是简单地在区域对象上调用destroy时,我自己得到了这个错误:

 ERROR:  zero-length delimited identifier at or near """"
 LINE 1: DELETE FROM "regions" WHERE "regions"."" = $1

我知道问题是由于缺少Regions表的主键引起的。奇怪的是,如果我将主键添加回表中,则销毁工作正常并且没有错误。但是,如果我从表中删除主键,则会返回错误。我知道这与postgres有关但我不知道如何解决这个问题而不必在我的Regions表中添加主键列。

这是实际查询

[DEBUG] [AdminUser Load (0.4ms)  SELECT  "admin_users".* FROM "admin_users"  WHERE "admin_users"."id" = 1  ORDER BY "admin_users"."id" ASC LIMIT 1] (pid:29655)
[DEBUG] [Province Load (0.2ms)  SELECT  "provinces".* FROM "provinces"  WHERE "provinces"."id" = $1 LIMIT 1  [["id", 5]]] (pid:29655)
[DEBUG] [ (0.1ms)  BEGIN] (pid:29655)
[DEBUG] [Region Load (0.3ms)  SELECT "regions".* FROM "regions"  WHERE "regions"."province_id" = $1  [["province_id", 5]]] (pid:29655)
[ERROR] [PG::SyntaxError: ERROR:  zero-length delimited identifier at or near """"
LINE 1: DELETE FROM "regions" WHERE "regions"."" = $1

5 个答案:

答案 0 :(得分:15)

你想要单引号而不是空字符串周围的双引号,双引号是分隔标识符,""不是一个有意义的标识符。

尝试:

WHERE 'regions'.'' = $1

或至少:

WHERE "regions".'' = $1

答案 1 :(得分:13)

尝试设置dependent: :delete_all

示例(不完全确定如何设置多对多关系)。

  

#models / region.rb
  ...
  has_many:provinces_regions,dependent :: delete_all
  has_many:provinces,::: provinces_regions
  ...

:destroy /:destroy_all 将通过调用destroy方法删除关联对象,从而调用回调(:before_destroy,:after_destroy等)

:delete /:delete_all 会删除关联的对象而不调用其destroy方法。

答案 2 :(得分:1)

由于这里没有任何答案对我有用,我想我会包含我的自定义修复程序。不确定您的用例的翻译是什么,但我希望我的策略的要点是明确的。

我也在使用自定义主键(uuid)。为了删除我的连接表上的记录,我跳过了实际删除调用的活动记录,而是使用了SQL。

uid = BucketListPhoto.find_by(bucket_list_id: 12, photo_id: 4).uid

deleted_uids = ActiveRecord::Base.connection.execute(
    "DELETE FROM bucket_list_photos WHERE uid='#{uid}' RETURNING uid"
).to_a.map { |record| record['uid'] }

我覆盖了BucketListPhoto#destroy来使用它。

我也尝试覆盖BuckerListPhoto::ActiveRecord::Query#destroy_all但是无法成功传递uid数组(用单个查询删除多个)。

答案 3 :(得分:0)

基于Alex Carol的回答,但解决方案却完全不同。

如果有人这样做:

<div><form method="post" id="form1" name="form1" action="" >
 <input name="download" id="download" type="submit" value="Download" />
 </form></div>
 <?php
if (isset($_POST['download'])) {
do{
$file=$row_g['image_name'];
 $download_path = 'upload/'.$file;
 $file_to_download = $download_path;
  header("Expires: 0");
  header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
  header("Cache-Control: no-store, no-cache, must-revalidate");
  header("Cache-Control: post-check=0, pre-check=0", false);
  header("Pragma: no-cache");  header("Content-type: application/file");
  header('Content-length: '.filesize($file_to_download));
  header('Content-disposition: attachment; 
  filename='.basename($file_to_download));
  readfile($file_to_download);
  } while ($row_g = mysqli_fetch_assoc($result_g));

  }
  ?>

并遇到了这个问题,那么我想你可能是这样做的:

# models/region.rb
...
has_many :provinces_regions, dependent: :destroy_all
has_many :provinces, through: :provinces_regions
...

如果以上情况成立,那么Rails会尝试使用create_table :provinces_regions, id: false do |t| t.belongs_to :regions, index: true t.belongs_to :provinces, index: true end 来运行销毁前的回调。因此,给它一个id

id

因此,您可以继续使用create_table :provinces_regions do |t| t.belongs_to :regions, index: true t.belongs_to :provinces, index: true end 并使用需要dependent: :destroy_all的回调和其他功能。

答案 4 :(得分:0)

问题是“”更改参数”

来自:

DELETE FROM "regions" WHERE "regions"."" = $1

收件人:

DELETE FROM "regions" WHERE "regions".'' = $1