Search code examples
sqlpostgresqlsequelize.jsuuid

How to INSERT a reference to UUID from another table in PostgreSQL?


I'm learning to use Sequelize to use with a PostgreSQL database. All of the following is happening on a dev. environment. This happened while manually trying to insert data into my tables to check if things are setup correctly through Sequelize, check on failing unit tests, etc.

I've made two tables with Sequelize models: User and Publication. Both these tables are generating UUIDv4. I've associated the User hasMany Publications, and Publication belongsTo User (you may reference the extra info).

On my psql shell, I've inserted the following record to my User table (rest of the data cut out for brevity):

|                   id                   |  firstName | lastName  | ..| 
|----------------------------------------|------------|-----------|---|
|  8c878e6f-ee13-4a37-a208-7510c2638944  |   Aiz      |    ....   |...|

Now I'm trying to insert a record into my Publication table while referencing my newly created user above. Here's what I entered into the shell:

INSERT INTO "Publications"("title", "fileLocation", ..., "userId")VALUES('How to Pasta', 'www.pasta.com', ..., 8c878e6f-ee13-4a37-a208-7510c2638944);

It fails and I receive the following error:

ERROR:  syntax error at or near "c878e6f"
LINE 1: ...8c878e6f-ee...

(it points to the second character on the terminal in LINE 1 reference - the 'c').

What's wrong here? Are we supposed to enter UUIDs another way if we want to do it manually in psql? Do we paste the referenced UUID as a string? Is there a correct way I'm missing from my own research?


Some extra info if it helps:

From my models:

Publication.associate = function(models) {
  // associations can be defined here
  Publication.belongsTo(models.User, {
    foreignKey: "userId" 
  });
};

and

User.associate = function(models) {
  // associations can be defined here
  User.hasMany(models.Publication, {
    foreignKey: "userId",
    as: "publications"
  });
};

Here's how I've defined userId in Publication:

userId: {
  type: DataTypes.UUID,
  references: {
    model: "User",
    key: "id",
    as: "userId"
  }
}

If it's worth anything, my (primaryKey) id on both models are type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4 (I don't know if this is an issue).


Solution

  • surround your uuid in apostrophes (write it as a string) and pg will convert it to a uuid

    Starting and ending your string with {} is optional

    Eg

    INSERT INTO "Publications"("title", "fileLocation", ..., "userId")VALUES('How to Pasta', 'www.pasta.com', ..., '8c878e6f-ee13-4a37-a208-7510c2638944');
    

    Or

    INSERT INTO "Publications"("title", "fileLocation", ..., "userId")VALUES('How to Pasta', 'www.pasta.com', ..., '{8c878e6f-ee13-4a37-a208-7510c2638944}');
    

    Source (I don't do pgsql much so I casted around for another person who wrote some working pgsql. If this doesn't work out for you let me know and I'll remove the answer): PostgreSQL 9.3: How to insert upper case UUID into table