mirror of https://github.com/AMT-Cheif/drift.git
Fix use of primary key in migrations
This commit is contained in:
parent
51ae079c33
commit
211bf56ae7
|
@ -69,7 +69,8 @@ class Migrator {
|
||||||
if (i < table.$columns.length - 1) sql.write(', ');
|
if (i < table.$columns.length - 1) sql.write(', ');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (table.$primaryKey != null && !hasAutoIncrement) {
|
final hasPrimaryKey = table.$primaryKey?.isNotEmpty ?? false;
|
||||||
|
if (hasPrimaryKey && !hasAutoIncrement) {
|
||||||
sql.write(', PRIMARY KEY (');
|
sql.write(', PRIMARY KEY (');
|
||||||
final pkList = table.$primaryKey.toList(growable: false);
|
final pkList = table.$primaryKey.toList(growable: false);
|
||||||
for (var i = 0; i < pkList.length; i++) {
|
for (var i = 0; i < pkList.length; i++) {
|
||||||
|
|
|
@ -9,8 +9,8 @@ mixin TableInfo<TableDsl extends Table, DataClass> {
|
||||||
/// [TableInfo] and [TableDsl] and can thus just return their instance.
|
/// [TableInfo] and [TableDsl] and can thus just return their instance.
|
||||||
TableDsl get asDslTable;
|
TableDsl get asDslTable;
|
||||||
|
|
||||||
/// The primary key of this table. Can be null if no custom primary key has
|
/// The primary key of this table. Can be null or empty if no custom primary
|
||||||
/// been specified
|
/// key has been specified.
|
||||||
Set<GeneratedColumn> get $primaryKey => null;
|
Set<GeneratedColumn> get $primaryKey => null;
|
||||||
|
|
||||||
/// The table name in the sql table. This can be an alias for the actual table
|
/// The table name in the sql table. This can be an alias for the actual table
|
||||||
|
|
|
@ -46,7 +46,13 @@ class SharedTodos extends Table {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@UseMoor(tables: [TodosTable, Categories, Users, SharedTodos])
|
class TableWithoutPK extends Table {
|
||||||
|
|
||||||
|
IntColumn get notReallyAnId => integer()();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseMoor(tables: [TodosTable, Categories, Users, SharedTodos, TableWithoutPK])
|
||||||
class TodoDb extends _$TodoDb {
|
class TodoDb extends _$TodoDb {
|
||||||
TodoDb(QueryExecutor e) : super(e);
|
TodoDb(QueryExecutor e) : super(e);
|
||||||
|
|
||||||
|
|
|
@ -642,6 +642,103 @@ class $SharedTodosTable extends SharedTodos
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TableWithoutPKData {
|
||||||
|
final int notReallyAnId;
|
||||||
|
TableWithoutPKData({this.notReallyAnId});
|
||||||
|
factory TableWithoutPKData.fromData(
|
||||||
|
Map<String, dynamic> data, GeneratedDatabase db,
|
||||||
|
{String prefix}) {
|
||||||
|
final effectivePrefix = prefix ?? '';
|
||||||
|
final intType = db.typeSystem.forDartType<int>();
|
||||||
|
return TableWithoutPKData(
|
||||||
|
notReallyAnId: intType
|
||||||
|
.mapFromDatabaseResponse(data['${effectivePrefix}not_really_an_id']),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
factory TableWithoutPKData.fromJson(Map<String, dynamic> json) {
|
||||||
|
return TableWithoutPKData(
|
||||||
|
notReallyAnId: json['notReallyAnId'] as int,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return {
|
||||||
|
'notReallyAnId': notReallyAnId,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
TableWithoutPKData copyWith({int notReallyAnId}) => TableWithoutPKData(
|
||||||
|
notReallyAnId: notReallyAnId ?? this.notReallyAnId,
|
||||||
|
);
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return (StringBuffer('TableWithoutPKData(')
|
||||||
|
..write('notReallyAnId: $notReallyAnId')
|
||||||
|
..write(')'))
|
||||||
|
.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => $mrjf($mrjc(0, notReallyAnId.hashCode));
|
||||||
|
@override
|
||||||
|
bool operator ==(other) =>
|
||||||
|
identical(this, other) ||
|
||||||
|
(other is TableWithoutPKData && other.notReallyAnId == notReallyAnId);
|
||||||
|
}
|
||||||
|
|
||||||
|
class $TableWithoutPKTable extends TableWithoutPK
|
||||||
|
with TableInfo<$TableWithoutPKTable, TableWithoutPKData> {
|
||||||
|
final GeneratedDatabase _db;
|
||||||
|
final String _alias;
|
||||||
|
$TableWithoutPKTable(this._db, [this._alias]);
|
||||||
|
GeneratedIntColumn _notReallyAnId;
|
||||||
|
@override
|
||||||
|
GeneratedIntColumn get notReallyAnId =>
|
||||||
|
_notReallyAnId ??= _constructNotReallyAnId();
|
||||||
|
GeneratedIntColumn _constructNotReallyAnId() {
|
||||||
|
var cName = 'not_really_an_id';
|
||||||
|
if (_alias != null) cName = '$_alias.$cName';
|
||||||
|
return GeneratedIntColumn(
|
||||||
|
'not_really_an_id',
|
||||||
|
$tableName,
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<GeneratedColumn> get $columns => [notReallyAnId];
|
||||||
|
@override
|
||||||
|
$TableWithoutPKTable get asDslTable => this;
|
||||||
|
@override
|
||||||
|
String get $tableName => _alias ?? 'table_without_p_k';
|
||||||
|
@override
|
||||||
|
final String actualTableName = 'table_without_p_k';
|
||||||
|
@override
|
||||||
|
bool validateIntegrity(TableWithoutPKData instance, bool isInserting) =>
|
||||||
|
notReallyAnId.isAcceptableValue(instance.notReallyAnId, isInserting);
|
||||||
|
@override
|
||||||
|
Set<GeneratedColumn> get $primaryKey => {};
|
||||||
|
@override
|
||||||
|
TableWithoutPKData map(Map<String, dynamic> data, {String tablePrefix}) {
|
||||||
|
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null;
|
||||||
|
return TableWithoutPKData.fromData(data, _db, prefix: effectivePrefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, Variable> entityToSql(TableWithoutPKData d,
|
||||||
|
{bool includeNulls = false}) {
|
||||||
|
final map = <String, Variable>{};
|
||||||
|
if (d.notReallyAnId != null || includeNulls) {
|
||||||
|
map['not_really_an_id'] = Variable<int, IntType>(d.notReallyAnId);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
$TableWithoutPKTable createAlias(String alias) {
|
||||||
|
return $TableWithoutPKTable(_db, alias);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
abstract class _$TodoDb extends GeneratedDatabase {
|
abstract class _$TodoDb extends GeneratedDatabase {
|
||||||
_$TodoDb(QueryExecutor e) : super(const SqlTypeSystem.withDefaults(), e);
|
_$TodoDb(QueryExecutor e) : super(const SqlTypeSystem.withDefaults(), e);
|
||||||
$TodosTableTable _todosTable;
|
$TodosTableTable _todosTable;
|
||||||
|
@ -652,6 +749,10 @@ abstract class _$TodoDb extends GeneratedDatabase {
|
||||||
$UsersTable get users => _users ??= $UsersTable(this);
|
$UsersTable get users => _users ??= $UsersTable(this);
|
||||||
$SharedTodosTable _sharedTodos;
|
$SharedTodosTable _sharedTodos;
|
||||||
$SharedTodosTable get sharedTodos => _sharedTodos ??= $SharedTodosTable(this);
|
$SharedTodosTable get sharedTodos => _sharedTodos ??= $SharedTodosTable(this);
|
||||||
|
$TableWithoutPKTable _tableWithoutPK;
|
||||||
|
$TableWithoutPKTable get tableWithoutPK =>
|
||||||
|
_tableWithoutPK ??= $TableWithoutPKTable(this);
|
||||||
@override
|
@override
|
||||||
List<TableInfo> get allTables => [todosTable, categories, users, sharedTodos];
|
List<TableInfo> get allTables =>
|
||||||
|
[todosTable, categories, users, sharedTodos, tableWithoutPK];
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,9 @@ void main() {
|
||||||
'FOREIGN KEY (todo) REFERENCES todos(id), '
|
'FOREIGN KEY (todo) REFERENCES todos(id), '
|
||||||
'FOREIGN KEY (user) REFERENCES users(id)'
|
'FOREIGN KEY (user) REFERENCES users(id)'
|
||||||
');'));
|
');'));
|
||||||
|
|
||||||
|
verify(mockQueryExecutor.call('CREATE TABLE IF NOT EXISTS '
|
||||||
|
'table_without_p_k (not_really_an_id INTEGER NOT NULL);'));
|
||||||
});
|
});
|
||||||
|
|
||||||
test('creates individual tables', () async {
|
test('creates individual tables', () async {
|
||||||
|
|
Loading…
Reference in New Issue