Hi. Publish this topic in General Discussions because i think reason not in REST.
I have DB on postgres 9.6 with table
CREATE TABLE public.projects
(
name character varying(100) COLLATE pg_catalog."default" NOT NULL,
priority smallint NOT NULL DEFAULT 0,
id bigint NOT NULL DEFAULT nextval('projects_id_seq'::regclass),
CONSTRAINT projects_pkey PRIMARY KEY (id),
CONSTRAINT name UNIQUE (name)
)
WITH (
OIDS = FALSE
)
Try to create simple REST application by manual. Controller:
class ProjectsController extends ActiveController
{
public $modelClass = 'app\models\Projects';
}
Model generated by gii:
class Projects extends \yii\db\ActiveRecord
{
/**
* {@inheritdoc}
*/
public static function tableName()
{
return 'projects';
}
/**
* {@inheritdoc}
*/
public function rules()
{
return [
[['name'], 'required'],
[['priority'], 'default', 'value' => 0],
[['priority'], 'integer'],
[['name'], 'string', 'max' => 100],
[['name'], 'unique'],
];
}
/**
* {@inheritdoc}
*/
public function attributeLabels()
{
return [
'name' => 'Name',
'priority' => 'Priority',
'id' => 'ID',
];
}
}
In table already added first record (manually, by pgadmin) with id 1. Try to add second record by REST
curl -i -H "Accept:application/json" -H "Content-Type:application/json" -XPOST "http://localhost/projects" -d '{"name": "testprj2"}'
And get strange error (russian text on english like “Error: not unique value in projects_pkey, key id=1 already exists”):
{
"name": "Integrity constraint violation",
"message": "SQLSTATE[23505]: Unique violation: 7 ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности \"projects_pkey\"\nDETAIL: Ключ \"(id)=(1)\" уже существует.\nThe SQL being executed was: INSERT INTO \"projects\" (\"name\", \"priority\") VALUES ('testprj2', 0) RETURNING \"id\"",
"code": 23505,
"type": "yii\\db\\IntegrityException",
"file": "/home/www/cr-ng-web/vendor/yiisoft/yii2/db/Schema.php",
"line": 664,
"stack-trace": [
"#0 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/Command.php(1263): yii\\db\\Schema->convertException(Object(PDOException), 'INSERT INTO \"pr...')",
"#1 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/Command.php(1148): yii\\db\\Command->internalExecute('INSERT INTO \"pr...')",
"#2 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/Command.php(413): yii\\db\\Command->queryInternal('fetch', NULL)",
"#3 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/pgsql/Schema.php(617): yii\\db\\Command->queryOne()",
"#4 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/ActiveRecord.php(549): yii\\db\\pgsql\\Schema->insert('projects', Array)",
"#5 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/ActiveRecord.php(515): yii\\db\\ActiveRecord->insertInternal(NULL)",
"#6 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/BaseActiveRecord.php(670): yii\\db\\ActiveRecord->insert(true, NULL)",
"#7 /home/www/cr-ng-web/vendor/yiisoft/yii2/rest/CreateAction.php(52): yii\\db\\BaseActiveRecord->save()",
"#8 [internal function]: yii\\rest\\CreateAction->run()",
"#9 /home/www/cr-ng-web/vendor/yiisoft/yii2/base/Action.php(94): call_user_func_array(Array, Array)",
"#10 /home/www/cr-ng-web/vendor/yiisoft/yii2/base/Controller.php(157): yii\\base\\Action->runWithParams(Array)",
"#11 /home/www/cr-ng-web/vendor/yiisoft/yii2/base/Module.php(528): yii\\base\\Controller->runAction('create', Array)",
"#12 /home/www/cr-ng-web/vendor/yiisoft/yii2/web/Application.php(103): yii\\base\\Module->runAction('projects/create', Array)",
"#13 /home/www/cr-ng-web/vendor/yiisoft/yii2/base/Application.php(386): yii\\web\\Application->handleRequest(Object(yii\\web\\Request))",
"#14 /home/www/cr-ng-web/web/index.php(12): yii\\base\\Application->run()",
"#15 {main}"
],
"error-info": [
"23505",
7,
"ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности \"projects_pkey\"\nDETAIL: Ключ \"(id)=(1)\" уже существует."
],
"previous": {
"name": "Exception",
"message": "SQLSTATE[23505]: Unique violation: 7 ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности \"projects_pkey\"\nDETAIL: Ключ \"(id)=(1)\" уже существует.",
"code": "23505",
"type": "PDOException",
"file": "/home/www/cr-ng-web/vendor/yiisoft/yii2/db/Command.php",
"line": 1258,
"stack-trace": [
"#0 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/Command.php(1258): PDOStatement->execute()",
"#1 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/Command.php(1148): yii\\db\\Command->internalExecute('INSERT INTO \"pr...')",
"#2 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/Command.php(413): yii\\db\\Command->queryInternal('fetch', NULL)",
"#3 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/pgsql/Schema.php(617): yii\\db\\Command->queryOne()",
"#4 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/ActiveRecord.php(549): yii\\db\\pgsql\\Schema->insert('projects', Array)",
"#5 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/ActiveRecord.php(515): yii\\db\\ActiveRecord->insertInternal(NULL)",
"#6 /home/www/cr-ng-web/vendor/yiisoft/yii2/db/BaseActiveRecord.php(670): yii\\db\\ActiveRecord->insert(true, NULL)",
"#7 /home/www/cr-ng-web/vendor/yiisoft/yii2/rest/CreateAction.php(52): yii\\db\\BaseActiveRecord->save()",
"#8 [internal function]: yii\\rest\\CreateAction->run()",
"#9 /home/www/cr-ng-web/vendor/yiisoft/yii2/base/Action.php(94): call_user_func_array(Array, Array)",
"#10 /home/www/cr-ng-web/vendor/yiisoft/yii2/base/Controller.php(157): yii\\base\\Action->runWithParams(Array)",
"#11 /home/www/cr-ng-web/vendor/yiisoft/yii2/base/Module.php(528): yii\\base\\Controller->runAction('create', Array)",
"#12 /home/www/cr-ng-web/vendor/yiisoft/yii2/web/Application.php(103): yii\\base\\Module->runAction('projects/create', Array)",
"#13 /home/www/cr-ng-web/vendor/yiisoft/yii2/base/Application.php(386): yii\\web\\Application->handleRequest(Object(yii\\web\\Request))",
"#14 /home/www/cr-ng-web/web/index.php(12): yii\\base\\Application->run()",
"#15 {main}"
]
}
}
It confused me because in trace i see query
INSERT INTO "projects" ("name", "priority") VALUES ('testprj2', 0)
There is no id field and it must generated automatically by postgres. I get this query and run into pgadmin. Project #2 was successfully added. After that i without problems added project #3 by REST. This strange error is dissapeared.
How you think, this is PostgreSQL problem or some yii bug?