renderCreateTable method

  1. @override
List<String> renderCreateTable(
  1. TableBlueprint blueprint, {
  2. bool ifNotExists = false,
})
override

Implementation

@override
List<String> renderCreateTable(
  TableBlueprint blueprint, {
  bool ifNotExists = false,
}) {
  final statements = <String>[];
  final buf = StringBuffer();
  final createClause = ifNotExists
      ? 'CREATE TABLE IF NOT EXISTS'
      : 'CREATE TABLE';

  buf.writeln('$createClause "${blueprint.tableName}" (');

  final parts = <String>[];
  bool hasSerial = false;

  for (final col in blueprint.columns) {
    final isAutoIncrPrimary =
        col.autoIncrement && col.name == blueprint.primaryKey;
    if (isAutoIncrPrimary) hasSerial = true;
    parts.add('  ${_renderColumn(col, isAutoIncrPrimary)}');
  }

  if (blueprint.primaryKey != null && !hasSerial) {
    parts.add('  PRIMARY KEY ("${blueprint.primaryKey}")');
  }

  for (final uc in blueprint.uniqueConstraints) {
    final cols = uc.columns.map((c) => '"$c"').join(', ');
    parts.add('  CONSTRAINT "${uc.name}" UNIQUE ($cols)');
  }

  for (final fk in blueprint.foreignKeys) {
    final constraint = fk.constrained
        ? 'CONSTRAINT "FK_${blueprint.tableName}_${fk.referencesTable}" '
        : '';
    parts.add(
      '  ${constraint}FOREIGN KEY ("${fk.columnName}") '
      'REFERENCES "${fk.referencesTable}" ("${fk.referencesColumn}") '
      'ON UPDATE ${fk.onUpdate} ON DELETE ${fk.onDelete}',
    );
  }

  buf.write(parts.join(',\n'));
  buf.write('\n)');

  statements.add(buf.toString());

  for (final idx in blueprint.indexes) {
    statements.addAll(renderAddIndex(blueprint.tableName, idx));
  }

  statements.addAll(_columnComments(blueprint.tableName, blueprint.columns));

  return statements;
}