0

I am using PostgreSQL foreign data wrapper Multicorn (which uses SQLAlchemy) to map tables from external MySQL database. Everything seems to be working fine so far, except one issue: if I run an insert query on my foreign mysql table without specifying primary ID, because it's set to auto increment, foreign data wrapper tries to append and starts the increment from 1 even though such a key already exists in the remote MySQL table. This is better explained by example:

MySQL table:

CREATE TABLE `test` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `value` VARCHAR(100) NULL DEFAULT NULL,
  PRIMARY KEY (`id`));

MySQL table data:

select * from test;
+----+-------+
| id | value |
+----+-------+
|  1 | val1  |
|  2 | val2  |
|  3 | val3  |
+----+-------+

PostgreSQL FDW server:

CREATE SERVER test foreign data wrapper multicorn options (wrapper 'multicorn.sqlalchemyfdw.SqlAlchemyFdw');

PostgreSQL FDW table:

create foreign table test1 (
    id serial,
    value character varying
) server test options (
    tablename 'test',
    db_url 'mysql://root:[email protected]/test',
    primary_key 'id'
);

This is the insert statement that I've tried:

insert into test1 (value) values ('val4');

It throws this error:

ERROR:  Error in python: IntegrityError
DETAIL:  (IntegrityError) (1062, "Duplicate entry '1' for key 'PRIMARY'") 'INSERT INTO test (id, value) VALUES (%s, %s)' (1L, u'val4')

For some reason there is an attempt to manually insert a primary ID which I've specified as auto increment on both databases/tables. Why is this happening and how can I fix it? What is causing this, is it Postgres, FDW plugin Multicorn or SQLAlchemy?

1 Answer 1

2

What if you use int instead of serial on the PostgreSQL side?

create foreign table test1 (
    id int,
    value character varying
) server test options (
    tablename 'test',
    db_url 'mysql://root:[email protected]/test',
    primary_key 'id'
);
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.