Read primary key in drift files

This commit is contained in:
Simon Binder 2022-10-23 17:36:28 +02:00
parent 75169c9d7e
commit 9f48d49cb3
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
5 changed files with 46 additions and 27 deletions

View File

@ -853,11 +853,11 @@ class MytableCompanion extends UpdateCompanion<MytableData> {
this.somedate = const Value.absent(), this.somedate = const Value.absent(),
}); });
MytableCompanion.insert({ MytableCompanion.insert({
required int someid, this.someid = const Value.absent(),
this.sometext = const Value.absent(), this.sometext = const Value.absent(),
this.isInserting = const Value.absent(), this.isInserting = const Value.absent(),
this.somedate = const Value.absent(), this.somedate = const Value.absent(),
}) : someid = Value(someid); });
static Insertable<MytableData> custom({ static Insertable<MytableData> custom({
Expression<int>? someid, Expression<int>? someid,
Expression<String>? sometext, Expression<String>? sometext,
@ -923,7 +923,7 @@ class $MytableTable extends Table with TableInfo<$MytableTable, MytableData> {
final VerificationMeta _someidMeta = const VerificationMeta('someid'); final VerificationMeta _someidMeta = const VerificationMeta('someid');
late final GeneratedColumn<int> someid = GeneratedColumn<int>( late final GeneratedColumn<int> someid = GeneratedColumn<int>(
'someid', aliasedName, false, 'someid', aliasedName, false,
type: DriftSqlType.int, requiredDuringInsert: true); type: DriftSqlType.int, requiredDuringInsert: false);
final VerificationMeta _sometextMeta = const VerificationMeta('sometext'); final VerificationMeta _sometextMeta = const VerificationMeta('sometext');
late final GeneratedColumn<String> sometext = GeneratedColumn<String>( late final GeneratedColumn<String> sometext = GeneratedColumn<String>(
'sometext', aliasedName, true, 'sometext', aliasedName, true,
@ -954,8 +954,6 @@ class $MytableTable extends Table with TableInfo<$MytableTable, MytableData> {
if (data.containsKey('someid')) { if (data.containsKey('someid')) {
context.handle(_someidMeta, context.handle(_someidMeta,
someid.isAcceptableOrUnknown(data['someid']!, _someidMeta)); someid.isAcceptableOrUnknown(data['someid']!, _someidMeta));
} else if (isInserting) {
context.missing(_someidMeta);
} }
if (data.containsKey('sometext')) { if (data.containsKey('sometext')) {
context.handle(_sometextMeta, context.handle(_sometextMeta,
@ -976,7 +974,7 @@ class $MytableTable extends Table with TableInfo<$MytableTable, MytableData> {
} }
@override @override
Set<GeneratedColumn> get $primaryKey => const <GeneratedColumn>{}; Set<GeneratedColumn> get $primaryKey => {someid};
@override @override
MytableData map(Map<String, dynamic> data, {String? tablePrefix}) { MytableData map(Map<String, dynamic> data, {String? tablePrefix}) {
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';

View File

@ -56,8 +56,8 @@ class DartTableResolver extends LocalElementResolver<DiscoveredDartTable> {
existingRowClass: dataClassInfo.existingClass, existingRowClass: dataClassInfo.existingClass,
customParentClass: dataClassInfo.extending, customParentClass: dataClassInfo.extending,
baseDartName: element.name, baseDartName: element.name,
primaryKeyFromTableConstraint: primaryKey,
tableConstraints: [ tableConstraints: [
if (primaryKey != null) PrimaryKeyColumns(primaryKey),
for (final uniqueKey in uniqueKeys ?? const <Set<DriftColumn>>[]) for (final uniqueKey in uniqueKeys ?? const <Set<DriftColumn>>[])
UniqueColumns(uniqueKey), UniqueColumns(uniqueKey),
], ],

View File

@ -176,6 +176,22 @@ class DriftTableResolver extends LocalElementResolver<DiscoveredDriftTable> {
onDelete: constraint.clause.onDelete, onDelete: constraint.clause.onDelete,
)); ));
} }
} else if (constraint is KeyClause) {
final keyColumns = <DriftColumn>{};
for (final keyColumn in constraint.columns) {
final expression = keyColumn.expression;
if (expression is Reference) {
keyColumns.add(columns
.firstWhere((e) => e.nameInSql == expression.columnName));
}
}
if (constraint.isPrimaryKey) {
tableConstraints.add(PrimaryKeyColumns(keyColumns));
} else {
tableConstraints.add(UniqueColumns(keyColumns));
}
} }
} }
} else if (stmt is CreateVirtualTableStatement) { } else if (stmt is CreateVirtualTableStatement) {

View File

@ -1,3 +1,4 @@
import 'package:collection/collection.dart';
import 'package:drift/drift.dart' show DriftSqlType; import 'package:drift/drift.dart' show DriftSqlType;
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
import 'package:sqlparser/sqlparser.dart' as sql; import 'package:sqlparser/sqlparser.dart' as sql;
@ -16,8 +17,6 @@ class DriftTable extends DriftElementWithResultSet {
final List<DriftTableConstraint> tableConstraints; final List<DriftTableConstraint> tableConstraints;
final Set<DriftColumn>? primaryKeyFromTableConstraint;
@override @override
final List<DriftElement> references; final List<DriftElement> references;
@ -69,7 +68,6 @@ class DriftTable extends DriftElementWithResultSet {
this.fixedEntityInfoName, this.fixedEntityInfoName,
this.withoutRowId = false, this.withoutRowId = false,
this.strict = false, this.strict = false,
this.primaryKeyFromTableConstraint,
this.tableConstraints = const [], this.tableConstraints = const [],
this.virtualTableData, this.virtualTableData,
this.writeDefaultConstraints = true, this.writeDefaultConstraints = true,
@ -83,12 +81,14 @@ class DriftTable extends DriftElementWithResultSet {
@override @override
String get dbGetterName => DriftSchemaElement.dbFieldName(baseDartName); String get dbGetterName => DriftSchemaElement.dbFieldName(baseDartName);
/// The primary key for this table, computed by looking at the /// The primary key for this table, computed by looking at the primary key
/// [primaryKeyFromTableConstraint] and primary key constraints applied to /// defined as a table constraint or as a column constraint.
/// individiual columns.
Set<DriftColumn> get fullPrimaryKey { Set<DriftColumn> get fullPrimaryKey {
if (primaryKeyFromTableConstraint != null) { final fromTable =
return primaryKeyFromTableConstraint!; tableConstraints.whereType<PrimaryKeyColumns>().firstOrNull;
if (fromTable != null) {
return fromTable.primaryKey;
} }
return columns return columns
@ -149,6 +149,12 @@ class UniqueColumns extends DriftTableConstraint {
UniqueColumns(this.uniqueSet); UniqueColumns(this.uniqueSet);
} }
class PrimaryKeyColumns extends DriftTableConstraint {
final Set<DriftColumn> primaryKey;
PrimaryKeyColumns(this.primaryKey);
}
class ForeignKeyTable extends DriftTableConstraint { class ForeignKeyTable extends DriftTableConstraint {
final List<DriftColumn> localColumns; final List<DriftColumn> localColumns;
final DriftTable otherTable; final DriftTable otherTable;

View File

@ -27,9 +27,6 @@ class ElementSerializer {
for (final column in element.columns) _serializeColumn(column), for (final column in element.columns) _serializeColumn(column),
], ],
'existing_data_class': element.existingRowClass?.toJson(), 'existing_data_class': element.existingRowClass?.toJson(),
'primary_key_table_constraint': element.primaryKeyFromTableConstraint
?.map((e) => e.nameInSql)
.toList(),
'table_constraints': [ 'table_constraints': [
for (final constraint in element.tableConstraints) for (final constraint in element.tableConstraints)
_serializeTableConstraint(constraint), _serializeTableConstraint(constraint),
@ -203,6 +200,13 @@ class ElementSerializer {
'type': 'unique', 'type': 'unique',
'columns': [for (final column in constraint.uniqueSet) column.nameInSql] 'columns': [for (final column in constraint.uniqueSet) column.nameInSql]
}; };
} else if (constraint is PrimaryKeyColumns) {
return {
'type': 'primary_key',
'columns': [
for (final column in constraint.primaryKey) column.nameInSql,
],
};
} else if (constraint is ForeignKeyTable) { } else if (constraint is ForeignKeyTable) {
return { return {
'type': 'foreign', 'type': 'foreign',
@ -411,14 +415,6 @@ class ElementDeserializer {
for (final column in columns) column.nameInSql: column, for (final column in columns) column.nameInSql: column,
}; };
Set<DriftColumn>? primaryKeyFromTableConstraint;
final serializedPk = json['primary_key_table_constraint'];
if (serializedPk != null) {
primaryKeyFromTableConstraint = {
for (final entry in serializedPk) columnByName[entry]!,
};
}
return DriftTable( return DriftTable(
id, id,
declaration, declaration,
@ -427,7 +423,6 @@ class ElementDeserializer {
existingRowClass: json['existing_data_class'] != null existingRowClass: json['existing_data_class'] != null
? ExistingRowClass.fromJson(json['existing_data_class'] as Map) ? ExistingRowClass.fromJson(json['existing_data_class'] as Map)
: null, : null,
primaryKeyFromTableConstraint: primaryKeyFromTableConstraint,
tableConstraints: [ tableConstraints: [
for (final constraint in json['table_constraints']) for (final constraint in json['table_constraints'])
await _readTableConstraint(constraint as Map, columnByName), await _readTableConstraint(constraint as Map, columnByName),
@ -667,6 +662,10 @@ class ElementDeserializer {
return UniqueColumns({ return UniqueColumns({
for (final ref in json['columns']) localColumns[ref]!, for (final ref in json['columns']) localColumns[ref]!,
}); });
case 'primary_key':
return PrimaryKeyColumns(
{for (final ref in json['columns']) localColumns[ref]!},
);
case 'foreign': case 'foreign':
return ForeignKeyTable( return ForeignKeyTable(
localColumns: [ localColumns: [