generateAddColumnAlterTableSQL method
AlterTableSQL
generateAddColumnAlterTableSQL(
- String table,
- String fieldName,
- TypeInfo fieldType, {
- List<
EntityField> ? entityFieldAnnotations,
Implementation
AlterTableSQL generateAddColumnAlterTableSQL(
String table,
String fieldName,
TypeInfo fieldType, {
List<EntityField>? entityFieldAnnotations,
}) {
var q = dialect.elementQuote;
var columnName = normalizeColumnName(fieldName);
var fieldSQLType = typeToSQLType(
fieldType,
columnName,
entityFieldAnnotations: entityFieldAnnotations,
);
var comment = '${fieldType.toString(withT: false)} $fieldName';
MapEntry<String, MapEntry<String, String>>? entityType;
String? refTable;
String? refColumn;
if (fieldSQLType == null) {
entityType = entityTypeToSQLType(
fieldType,
columnName,
entityFieldAnnotations: entityFieldAnnotations,
);
if (entityType != null) {
fieldSQLType = entityType.value.value;
refTable = entityType.key;
refColumn = entityType.value.key;
comment += ' @ $refTable.$refColumn';
}
}
if (fieldSQLType == null) {
var enumType = enumTypeToSQLType(
fieldType.type,
columnName,
entityFieldAnnotations: entityFieldAnnotations,
);
if (enumType != null) {
var type = enumType.key;
var values = enumType.value;
fieldSQLType = _buildEnumSQLType(
type,
fieldSQLType,
values,
q,
columnName,
);
comment += ' enum(${values.join(', ')})';
}
}
var columnEntry = SQLEntry(
'ADD',
' ADD COLUMN $q$columnName$q $fieldSQLType',
comment: comment,
);
List<CreateIndexSQL>? indexes;
List<AlterTableSQL>? constraints;
if (entityFieldAnnotations != null && entityFieldAnnotations.isNotEmpty) {
if (entityFieldAnnotations.hasUnique) {
var constrainUniqueName = '${table}__${columnName}__unique';
var uniqueEntry = SQLEntry(
'CONSTRAINT',
' ADD CONSTRAINT $q$constrainUniqueName$q UNIQUE ($q$columnName$q)',
columns: [
SQLColumn(
table,
columnName,
referenceTable: refTable!,
referenceColumn: refColumn!,
),
],
);
constraints = [
AlterTableSQL(dialect, table, [uniqueEntry]),
];
} else if (entityFieldAnnotations.hasIndexed) {
var indexName = '${table}__${columnName}__idx';
indexes = [CreateIndexSQL(dialect, table, columnName, indexName)];
}
}
if (entityType != null) {
var fieldName = columnName;
var ref = entityType;
var refTableName = ref.key;
var refField = ref.value.key.toLowerCase();
var constrainName = '${table}__${columnName}__fkey';
constraints ??= [];
var constraintEntry = SQLEntry(
'CONSTRAINT',
' ADD CONSTRAINT $q$constrainName$q FOREIGN KEY ($q$columnName$q) REFERENCES $q$refTableName$q($q$refField$q)',
comment: '$fieldName @ $refTableName.$refField',
columns: [
SQLColumn(
table,
columnName,
referenceTable: refTableName,
referenceColumn: refField,
),
],
);
constraints.add(AlterTableSQL(dialect, table, [constraintEntry]));
}
var alterTableSQL = AlterTableSQL(
dialect,
table,
[columnEntry],
indexes: indexes,
constraints: constraints,
);
return alterTableSQL;
}