mirror of https://github.com/AMT-Cheif/drift.git
Read primary key in drift files
This commit is contained in:
parent
75169c9d7e
commit
9f48d49cb3
|
@ -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.' : '';
|
||||||
|
|
|
@ -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),
|
||||||
],
|
],
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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: [
|
||||||
|
|
Loading…
Reference in New Issue