我正在尝试使用Laravel(v5.2.45)DB Seeder在Postgres DB中初始化查找表。
运行它时,得到以下输出:
[Illuminate\Database\QueryException]
SQLSTATE[42703]: Undefined column: 7 ERROR: column "lkup_type" of relation "syslookups" does not exist
LINE 1: insert into "syslookups" ("lkup_type", "lkup_text") values (...
^ (SQL: insert into "syslookups" ("lkup_type", "lkup_text") values (0, Employee))
这是播种机代码:
<?php
use Illuminate\Database\Seeder;
class SyslookupsSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('syslookups')->delete();
DB::table('syslookups')->insert(
['lkup_type'=>0, 'lkup_text'=>"Employee"],
['lkup_type'=>0, 'lkup_text'=>"Member"],
['lkup_type'=>1, 'lkup_text'=>"Open"],
['lkup_type'=>1, 'lkup_text'=>"Closed"],
// .. many more here
['lkup_type'=>5, 'lkup_text'=>"Yes"],
['lkup_type'=>5, 'lkup_text'=>"No"],
['lkup_type'=>6, 'lkup_text'=>"Work Phone"],
['lkup_type'=>6, 'lkup_text'=>"Fax"],
['lkup_type'=>6, 'lkup_text'=>"Home Phone"],
['lkup_type'=>6, 'lkup_text'=>"Cell Phone"]
);
}
}
任何想法如何使它不使用双引号?我试过在表名和列名周围用双引号引起来,结果相同。
该表有一个名为lkup_id
的串行列以及默认的created_at
和updated_at
列,我是否也需要为它们填充种子?
编辑
我发现引起双引号的行。 PostgresGrammar.php,function wrapValue()
,但是当我更改此行时:
return '"'.str_replace('"', '""', $value).'"';
对此:
return str_replace('"', '""', $value);
我现在收到此错误:
[Illuminate\Database\QueryException]
SQLSTATE[42703]: Undefined column: 7 ERROR: column "lkup_type" of relation "syslookups" does not exist
LINE 1: insert into syslookups (lkup_type, lkup_text) values ($1, $2...
^ (SQL: insert into syslookups (lkup_type, lkup_text) values (0, Employee))
在我看来,这似乎是Postgres的正确SQL ...
答案 0 :(得分:0)
Laravel的查询生成器似乎总是将列名放在Postgres的双引号内。我看不到任何禁用此选项的选项,也没有使用postgres。
在查询构建器中解决此问题的一种方法是将列名放在原始表达式中,但这不适用于您的insert语句,因为原始表达式将是数组的无效键。
似乎,如果您不想编写自己的驱动程序或修改Laravel的代码,则必须为此使用原始语句。
DB::insert('INSERT INTO syslookups (lkup_type, lkup_text) ...');
长话短说,Laravel可能会错误地假设所有列都应加引号,因此您可能要确保表定义与该约定匹配。
答案 1 :(得分:0)
好的,我发现引起双引号的行。在PostgresGrammar.php
中,
function wrapValue()
更改此行:
return '"'.str_replace('"', '""', $value).'"';
对此:
return str_replace('"', '""', $value);
我还发现我没有在表名前面加上模式名,并且列名实际上是不正确的。我猜是该死的老眼睛;-)
我还需要重置lkp_id列的串行序列,该序列在播种器中未更新。稍后,我将添加created_at和updated_at值。谢谢你看这个...
DB::table('eddie.syslookups')->delete();
DB::statement('ALTER SEQUENCE eddie.syslookups_lkp_id_seq RESTART');
DB::table('eddie.syslookups')->insert([
['lkp_type'=>0, 'lkp_text'=>"Employee"],
['lkp_type'=>0, 'lkp_text'=>"Member"],
['lkp_type'=>1, 'lkp_text'=>"Open"],
['lkp_type'=>1, 'lkp_text'=>"Closed"],
['lkup_type'=>1, 'lkup_text'=>"Closed"],
// .. many more here
['lkup_type'=>5, 'lkup_text'=>"Yes"],
['lkp_type'=>5, 'lkp_text'=>"No"],
['lkp_type'=>7, 'lkp_text'=>"Work Phone"],
['lkp_type'=>7, 'lkp_text'=>"Fax"],
['lkp_type'=>7, 'lkp_text'=>"Home Phone"],
['lkp_type'=>7, 'lkp_text'=>"Cell Phone"]]
);