Skip to content

Commit

Permalink
feat: use char(36) for uuid representation in mysql
Browse files Browse the repository at this point in the history
  • Loading branch information
imnotjames committed Jul 7, 2021
1 parent dffd125 commit fbe6fb5
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 14 deletions.
13 changes: 5 additions & 8 deletions src/driver/mysql/MysqlDriver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -546,7 +546,7 @@ export class MysqlDriver implements Driver {
return "tinyint";

} else if (column.type === "uuid") {
return "varchar";
return "char";

} else if (column.type === "json" && this.options.type === "mariadb") {
/*
Expand Down Expand Up @@ -639,13 +639,10 @@ export class MysqlDriver implements Driver {
if (column.length)
return column.length.toString();

/**
* fix https://github.com/typeorm/typeorm/issues/1139
*/
if (column.generationStrategy === "uuid")
return "36";

switch (column.type) {
case "uuid":
return "36";

case String:
case "varchar":
case "nvarchar":
Expand Down Expand Up @@ -754,7 +751,7 @@ export class MysqlDriver implements Driver {
return false; // we don't need new columns, we only need exist and changed

let columnMetadataLength = columnMetadata.length;
if (!columnMetadataLength && columnMetadata.generationStrategy === "uuid") { // fixing #3374
if (!columnMetadataLength) { // fixing #3374
columnMetadataLength = this.getColumnLength(columnMetadata);
}

Expand Down
8 changes: 6 additions & 2 deletions src/query-runner/BaseQueryRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -304,8 +304,12 @@ export abstract class BaseQueryRunner {
if (this.connection.hasMetadata(table.name)) {
const metadata = this.connection.getMetadata(table.name);
const columnMetadata = metadata.findColumnWithDatabaseName(column.name);
if (columnMetadata && columnMetadata.length)
return false;

if (columnMetadata) {
const columnMetadataLength = this.connection.driver.getColumnLength(columnMetadata);
if (columnMetadataLength)
return false;
}
}

if (this.connection.driver.dataTypeDefaults
Expand Down
2 changes: 1 addition & 1 deletion src/schema-builder/util/TableUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export class TableUtils {
static createTableColumnOptions(columnMetadata: ColumnMetadata, driver: Driver): TableColumnOptions {
return {
name: columnMetadata.databaseName,
length: columnMetadata.length,
length: driver.getColumnLength(columnMetadata),
width: columnMetadata.width,
charset: columnMetadata.charset,
collation: columnMetadata.collation,
Expand Down
15 changes: 12 additions & 3 deletions test/functional/uuid/mysql/uuid-mysql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ describe("uuid-mysql", () => {
await postRepository.save(post);
const loadedPost = await postRepository.findOne(1);
expect(loadedPost!.uuid).to.be.exist;
postTable!.findColumnByName("uuid")!.type.should.be.equal("varchar");
postTable!.findColumnByName("uuid")!.type.should.be.equal("char");

const post2 = new Post();
post2.uuid = "fd357b8f-8838-42f6-b7a2-ae027444e895";
Expand All @@ -47,10 +47,10 @@ describe("uuid-mysql", () => {
expect(loadedQuestion!.uuid2).to.equal("fd357b8f-8838-42f6-b7a2-ae027444e895");
expect(loadedQuestion!.uuid3).to.be.null;
expect(loadedQuestion!.uuid4).to.be.exist;
questionTable!.findColumnByName("id")!.type.should.be.equal("varchar");
questionTable!.findColumnByName("id")!.type.should.be.equal("char");
questionTable!.findColumnByName("uuid")!.type.should.be.equal("varchar");
questionTable!.findColumnByName("uuid2")!.type.should.be.equal("varchar");
questionTable!.findColumnByName("uuid3")!.type.should.be.equal("varchar");
questionTable!.findColumnByName("uuid3")!.type.should.be.equal("char");

const question2 = new Question();
question2.id = "1ecad7f6-23ee-453e-bb44-16eca26d5189";
Expand All @@ -76,4 +76,13 @@ describe("uuid-mysql", () => {
expect(question!.uuid2).to.exist;
})));

it("should create a table column that's char(36)", () => Promise.all(connections.map(async connection => {
const table = await connection.createQueryRunner().getTable('question')

const column = table?.columns.find(c => c.name === 'uuid')

expect(column?.type).to.equal("char")
expect(column?.length).to.equal("36")
})));

});

0 comments on commit fbe6fb5

Please sign in to comment.