Вопрос или проблема
Я пытаюсь настроить локальную базу данных с пакетом drift и предпочел бы писать как объявления таблиц, так и запросы в файлах drift, чтобы оставить это в SQL и отделить от других файлов. Однако я продолжаю получать ошибки, что таблица в моем запросе не может быть найдена в каких-либо импортах, потому что таблица определена в файле g.dart, который невозможно импортировать (я получил ошибку, когда пытался это сделать). Возможно ли это вообще сделать? Или мне просто придется смириться с тем, что мои запросы придется писать на Dart?
Кроме того, класс AuthDao выдает ошибку, что не удалось прочитать таблицы из аннотации @DriftAccessor, хотя я импортирую файл local_database.dart, и в редакторе нет ошибок. Я немного запутался в структуре взаимодействия между drift и dart!
-- create_tables.drift
----- ОПРЕДЕЛЕНИЯ ТАБЛИЦ -----
-- Таблица пользователей
CREATE TABLE Users (
id TEXT PRIMARY KEY,
created_at TEXT NOT NULL,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
user_name TEXT NOT NULL,
email_address TEXT NOT NULL,
city TEXT,
country TEXT,
dob TEXT,
gender TEXT,
bio TEXT,
privacy TEXT DEFAULT("Друзья")
);
// local_database.dart
import 'package:myapp/global/services/auth_queries.dart';
import 'package:drift/drift.dart';
import 'package:drift_flutter/drift_flutter.dart';
import 'package:flutter/foundation.dart';
part 'local_database.g.dart';
@DriftDatabase(include: {'create_tables.drift'}, daos: [AuthDao])
class LocalDatabase extends _$LocalDatabase {
LocalDatabase() : super(_openConnection());
@override
int get schemaVersion => 1;
static QueryExecutor _openConnection() {
return driftDatabase(name: 'local_db');
}
}
-- local_queries.drift
import 'package:myapp/global/services/local_database.dart';
saveUser: INSERT INTO Users (id, created_at, first_name, last_name, user_name, email_address) VALUES (:id, :created_at, :first_name, :last_name, :user_name, :email_address);
// auth_queries.dart
import 'package:myapp/global/services/local_database.dart';
import 'package:drift/drift.dart';
part 'auth_queries.g.dart';
@DriftAccessor(include: {'local_auth_queries.drift'}, tables: [Users])
class AuthDao extends DatabaseAccessor with _$AuthDaoMixin {
AuthDao(LocalDatabase db) : super(db);
// Future> getUsers() async {
// return await select(users).get();
// }
}
Ответ или решение
Для успешной работы с пакетом Drift и организации таблиц и запросов в отдельных файлах, необходимо учесть несколько важных моментов, чтобы избежать ошибок и обеспечить правильное взаимодействие между файлами и кодом на Dart.
1. Структура файлов и импорт
Как вы уже заметили, таблицы могут быть определены в одном Drift-файле, а запросы — в другом. Однако это требует правильной настройки импортов и структуры файлов. Например, если вы хотите импортировать таблицы в другой Drift-файл, это можно сделать следующим образом:
// local_queries.drift
// Убедитесь, что эта строка ссылается на файл, где определены таблицы
import 'package:myapp/global/services/local_database.dart';
saveUser: INSERT INTO Users (id, created_at, first_name, last_name, user_name, email_address)
VALUES (:id, :created_at, :first_name, :last_name, :user_name, :email_address);
Однако, чтобы получить доступ к таблицам из других файлов, вам нужно использовать правильное название и структуру экспорта. Убедитесь, что ваш @DriftAccessor
класс правильно настроен, чтобы включать файлы, где определены таблицы.
2. Ошибка с @DriftAccessor
Если ваш класс AuthDao
не может найти таблицы в аннотации @DriftAccessor
, убедитесь, что вы импортируете файл, содержащий определение таблиц, правильно. В данном примере ваш класс AuthDao
включает таблицу Users
, и следует убедиться, что Drift-файл, где определены эти таблицы (например, create_tables.drift
), был правильно включен в вашу базу данных.
Вот корректная структура:
// local_database.dart
import 'package:myapp/global/services/auth_queries.dart';
import 'package:drift/drift.dart';
import 'package:drift_flutter/drift_flutter.dart';
part 'local_database.g.dart';
@DriftDatabase(include: {'create_tables.drift'}, daos: [AuthDao])
class LocalDatabase extends _$LocalDatabase {
LocalDatabase() : super(_openConnection());
@override
int get schemaVersion => 1;
static QueryExecutor _openConnection() {
return driftDatabase(name: 'local_db');
}
}
// auth_queries.dart
import 'package:myapp/global/services/local_database.dart';
import 'package:drift/drift.dart';
part 'auth_queries.g.dart';
@DriftAccessor(tables: [Users])
class AuthDao extends DatabaseAccessor<LocalDatabase> with _$AuthDaoMixin {
AuthDao(LocalDatabase db) : super(db);
// Пример метода для получения пользователей
Future<List<User>> getUsers() async {
return await select(users).get(); // Не забудьте перенести определение Users сюда
}
}
3. Убедитесь, что вы собираете проект
После внесения всех необходимых изменений убедитесь, что проект собирается без ошибок. Пакет Drift генерирует .g.dart
файлы на основе вашего кода, поэтому наличие ошибок в ваших Drift-файлах может привести к тому, что генерация не пройдет успешно.
4. Организация запросов и автоматика
Если вы хотите организовать запросы в файлах, отличных от local_database.dart
, не забудьте указать правильный путь в вашей анотации @DriftAccessor
.
Для всех DAO, необходимо убедиться, что все таблицы на момент компиляции доступны и правильно импортированы.
Заключение
Следуя вышеуказанным шагам, вы сможете организовать вашу структуру проекта, избегая ошибок при взаимодействии между файлами Drift и Dart. Правильно настраивайте импорты и структуру данных, и вы сможете использовать мощные возможности Drift для работы с вашим локальным базой данных.