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;
}