I get the error on build :
Server failed to start due to error: SequelizeDatabaseError: syntax error at or near «SERIAL»
This error ONLY appears when the parameter autoIncrement=true is given to the primary key.
'use strict';
export default function(sequelize, DataTypes) {
return sequelize.define('Ladder', {
ladder_id: {
type: DataTypes.UUID,
allowNull: false,
primaryKey: true,
autoIncrement: true //<------- If commented it works fine
},
ladder_name: {
type: DataTypes.STRING(50),
allowNull: false,
unique: true
},
ladder_description: {
type: DataTypes.TEXT,
allowNull: true
},
ladder_open: {
type: DataTypes.BOOLEAN,
allowNull: false
},
ladder_hidden: {
type: DataTypes.BOOLEAN,
allowNull: false
},
ladder_creation_date: {
type: DataTypes.DATE,
allowNull: false
},
ladder_fk_user: {
type: DataTypes.INTEGER,
allowNull: false
},
ladder_fk_game: {
type: DataTypes.UUID,
allowNull: false
},
ladder_fk_platforms: {
type: DataTypes.ARRAY(DataTypes.UUID),
allowNull: false
}
},
{
schema: 'ladder',
tableName: 'ladders'
});
}
I have Sequelize 3.30.4 and postgreSQL 9.6.
I want autoIncrement at true because I am generating the UUID with postgreSQL uuid_generate_v4().
Not a regular sequelize user here but let me point out that using autoIncrement for non sequential column is not the right way in postgreql. Postgresql does not provide a default uuid number generator but an extension can be added easily https://www.postgresql.org/docs/9.4/static/uuid-ossp.html. I believev you have already done so.
The next step then is to us the sequelize.fn function.
Creates an object representing a database function. This can be used in search queries, both in where and order parts, and as default values in column definitions.
so we have
ladder_id: {
type: DataTypes.UUID,
allowNull: false,
primaryKey: true,
default: sequelize.fn('uuid_generate_v4')
}
Проблема при создании таблиц
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
сейчас решил протестировать контроллер баз данных и переключиться на постгрес. Создал базу, но при создании таблиц из под стандартного функционала phpPgAdmin вылезает ошибка: Цитата ERROR: syntax error at or near «(« В операторе:
CREATE TABLE «xgb_chidoridev».»cd_pages» («id» integer(10), «name» character varying(255), «title» character varying(255), «rights» integer(2), «priority» integer(1), «uopen» text, «uclose» text, «updatetime» integer(20), «createtime» integer(20), «theme» character varying(255), PRIMARY KEY («id»)) WITHOUT OIDS После прочтения мануала по постгрес, решил сделать так же как впримере — указывать таблицы и поля без кавычек. Но всё равно запрос не проходит. Подскажите, в чём может быть проблема? |
Silver Soft |
|
Member Рейтинг (т): 4 |
в типе integer убери «(…)» и вместо этого пользуйся другими типами, вроде smallint или serial… Добавлено 03.08.11, 05:16 |
Serafim |
|
Вот так сделал:
СREATE TABLE «xgb_chidoridev».»cd_pages» («id» smallint, «name» character varying(255), «title» character varying(255), «rights» smallint, «priority» smallint, «uopen» text, «uclose» text, «updatetime» smallint, «createtime» smallint, «theme» character varying(255), PRIMARY KEY («id»)) WITHOUT OIDS Всё равно ошибка вылетает |
Silver Soft |
|
Member Рейтинг (т): 4 |
Цитата Serafim @ 03.08.11, 05:19 Всё равно ошибка вылетает та же ошибка? Цитата Serafim @ 03.08.11, 05:19 «xgb_chidoridev» тебе все в кавычки принципиально нужно? ))) |
Serafim |
|
Цитата Silver Soft @ 03.08.11, 05:22 та же ошибка?
ERROR: syntax error at or near «СREATE» Цитата Silver Soft @ 03.08.11, 05:22 тебе все в кавычки принципиально нужно? ))) Ну это phpPgAdmin по умолчанию ставит Просто пока не особо знаком с синтаксисом Postgres, поэтому и использую его интерфейс |
Silver Soft |
|
Member Рейтинг (т): 4 |
вот у меня код создания таблицы:
CREATE TABLE phone.stat_201108 ( id integer, authid bigint, dialpeerid bigint, «SRCnum» character varying(50), «DSTnum» character varying(50), «ElapsedTime» bigint, «TimeBegin» timestamp(6) without time zone, «TimeConnect» timestamp(0) without time zone, «TimeDisconnect» timestamp(0) without time zone, «DisconnectCode» character varying(100), «DisconnectInitiator» character varying(20), «QoS» double precision, «SRCproto» character varying(100), «DSTProto» character varying(100), «SRCIP» inet, «DSTIP» inet, «SRCBytesIn» bigint, «DSTBytesIn» bigint, «CallId» integer, «SRCTarifId» integer, «SRCDuration» integer, «SRCCost» double precision, «SRCClientId» integer, «DSTTarifId» integer, «DSTDuration» integer, «DSTCost» double precision, «DSTClientId» integer, «DSTPrefixId» integer, «RootGroup» integer, «DateAdd» timestamp without time zone ) WITH ( OIDS=FALSE ); ALTER TABLE phone.stat_201108_old OWNER TO postgres; |
Serafim |
|
Цитата Silver Soft @ 03.08.11, 05:22 тебе все в кавычки принципиально нужно? )))
СREATE TABLE cd_pages (id smallint, name character varying(255), title character varying(255), rights smallint, priority smallint, uopen text, uclose text, updatetime smallint, createtime smallint, theme character varying(255), PRIMARY KEY (id)) WITHOUT OIDS Один хрен — эррор: Цитата ERROR: syntax error at or near «СREATE» |
Silver Soft |
|
Member Рейтинг (т): 4 |
«xgb_chidoridev» убери тут хотя бы )) и лучше пользуйся pgAdmin’ом )) им удобней )) Добавлено 03.08.11, 05:26 |
Serafim |
|
Цитата Silver Soft @ 03.08.11, 05:25 вот у меня код создания таблицы:
СREATE TABLE cd_pages ( id smallint, «name» character varying(255), «title» character varying(255), rights smallint, priority smallint, uopen text, uclose text, updatetime smallint, createtime smallint, «theme» character varying(255), PRIMARY KEY (id) ) WITHOUT OIDS Всё равно не работает Добавлено 03.08.11, 05:29 Цитата Ошибка SQL: ERROR: syntax error at or near «СREATE»
СREATE TABLE cd_pages ( id smallint, «name» character varying(255), «title» character varying(255), rights smallint, priority smallint, uopen text, uclose text, updatetime smallint, createtime smallint, «theme» character varying(255), PRIMARY KEY (id) ) WITH ( OIDS=FALSE ) Сообщение отредактировано: Serafim — 03.08.11, 05:30 |
Silver Soft |
|
Member Рейтинг (т): 4 |
чего-то мне кажется, что phpPgAdmin ерундовничает… я ошибки не вижу ) вроде все написано верно.. во только ощущение, что CREATE (С русская стоит) ))) |
ViktorXP |
|
пс. а почему id smallint. может нужен тип serial? |
Serafim |
|
Цитата Silver Soft @ 03.08.11, 05:31 во только ощущение, что CREATE (С русская стоит) ))) красавец! Просто когда в 10ый раз правил запрос — первая буква потерялась, перепечатал похоже на русском Добавлено 03.08.11, 05:36 Цитата ViktorXP @ 03.08.11, 05:35 пс. а почему id smallint. может нужен тип serial? ну дык яж майсикьюэльщик Вы мне тыкните что лучше и где, я запомню и подправлю |
Silver Soft |
|
Member Рейтинг (т): 4 |
для id лучше конечно serial, но я иногда и просто integer использую)) |
ViktorXP |
|
serial это типа bigint auto increment |
Silver Soft |
|
Member Рейтинг (т): 4 |
Цитата Silver Soft @ 03.08.11, 05:38 Просто когда в 10ый раз правил запрос — первая буква потерялась, перепечатал похоже на русском бывает)) со всеми бывает )) а если еще не спать сутками, то это уже самая частая ошибка ))) |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Базы данных: SQL
- Следующая тема
[ Script execution time: 0,0532 ] [ 15 queries used ] [ Generated: 13.02.23, 14:52 GMT ]
Я новичок в Postgresql и каждый день узнаю что-то новое. Итак, у меня есть этот блог-проект, в котором я хочу использовать PostgreSQL как базу данных. Но я как бы застрял в самом простом запросе вставки, который выдает ошибку. У меня есть три стола: posts
, authors
и categories
. Думаю, я мог бы правильно создать таблицу, но когда я пытаюсь вставить данные, я получаю эту ошибку:
error: syntax error at or near
length: 95,
severity: 'ERROR',
code: '42601',
detail: undefined,
hint: undefined,
position: '122',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'scan.l',
line: '1180',
routine: 'scanner_yyerror'
Теперь я не знаю, в чем проблема, и ошибки Postgres не так уж специфичны.
Кто-нибудь может сказать мне, где я могу ошибиться?
Вот таблицы:
const createInitialTables = `
CREATE TABLE authors (
id UUID NOT NULL,
author_name VARCHAR(100) NOT NULL UNIQUE CHECK (author_name <> ''),
author_slug VARCHAR(100) NOT NULL UNIQUE CHECK (author_slug <> ''),
PRIMARY KEY (id)
);
CREATE TABLE posts (
id UUID NOT NULL,
post VARCHAR(500) NOT NULL CHECK (post<> ''),
post_slug VARCHAR(500) NOT NULL CHECK (post_slug <> ''),
author_id UUID NOT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_authors FOREIGN KEY(author_id) REFERENCES authors(id)
);
CREATE TABLE categories (
id UUID NOT NULL,
category_name VARCHAR(50) NOT NULL CHECK (category_name <> ''),
category_slug VARCHAR(50) NOT NULL CHECK (category_slug <> ''),
post_id UUID NOT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_posts FOREIGN KEY(post_id) REFERENCES posts(id)
);
`;
Вот асинхронная функция, в которой я делаю запрос на вставку:
const insertAuthor = async() => {
try {
const data = await fs.readFile( path.join( __dirname + '../../data/data.json' ) );
const parsedData = JSON.parse( data.toString() );
const authorID = short.generate();
const authorName = parsedData[ 0 ].author;
const authorSlug = slugify( parsedData[ 0 ].author, {
strict: true,
lower: true
} );
const insertData = `
INSERT INTO authors (id, author_name, author_slug)
VALUES
(${authorID}, ${authorName}, ${authorSlug});
`;
await pool.query( insertData );
console.log( 'Data inserted successfully!' );
} catch ( e ) {
console.log( e );
}
};
insertAuthor();
ОБНОВИТЬ—————————————
Вот как выглядит файл журнала Postgres:
2021-10-18 01:23:16.885 +06 [5964] ERROR: syntax error at or near "Paton" at character 122
2021-10-18 01:23:16.885 +06 [5964] STATEMENT:
INSERT INTO authors (id, author_name, author_slug)
VALUES
(an3cxZh8ZD3tdtqG4wuwPR, Alan Paton, alan-paton);
2 ответа
Лучший ответ
INSERT INTO authors (id, author_name, author_slug)
VALUES
(an3cxZh8ZD3tdtqG4wuwPR, Alan Paton, alan-paton);
Ваши строковые значения не заключаются в кавычки. Это должно быть …
INSERT INTO authors (id, author_name, author_slug)
VALUES
('an3cxZh8ZD3tdtqG4wuwPR', 'Alan Paton', 'alan-paton');
Вы можете добавить кавычки в свой запрос, но не делайте этого. Ваш запрос в том виде, в котором он написан, небезопасен и уязвим для атаки с использованием SQL-инъекции. Не вставляйте значения в запросы с конкатенацией строк .
Вместо этого используйте параметры.
const insertSQL = `
INSERT INTO authors (id, author_name, author_slug)
VALUES ($1, $2, $3);
`;
await pool.query( insertSQL, [authorID, authorName, authorSlug] );
Postgres сделает за вас расценки. Это безопаснее, надежнее и быстрее.
Обратите внимание, что an3cxZh8ZD3tdtqG4wuwPR
не является допустимым UUID. UUID — это 128-битное целое число, которое часто представляется в виде 32-символьной шестнадцатеричной строки.
Обратите внимание, что вы также, вероятно, захотите использовать автоинкремент первичных ключей вместо самостоятельного создания идентификатора. Для первичного ключа UUID загрузите пакет uuid-ossp и используйте его функция UUID по умолчанию.
create extension "uuid-ossp";
create table authors (
id uuid primary key default uuid_generate_v4(),
-- There's no point in arbitrarily limiting the size of your text fields.
-- They will only use as much space as they need.
author_name text not null unique check (author_name <> ''),
author_slug text not null unique check (author_slug <> '')
);
insert into authors (author_name, author_slug)
values ('Alan Paton', 'alan-paton');
3
Schwern
17 Окт 2021 в 23:08
В запросе INSERT добавьте строковые значения в кавычки —
const insertData = `
INSERT INTO authors (id, author_name, author_slug)
VALUES
('${authorID}', '${authorName}', '${authorSlug}');`; // added the quotes
0
Vedant
17 Окт 2021 в 22:43