Запись запросов и таблиц в различных файлах данных.

Вопрос или проблема

Я пытаюсь настроить локальную базу данных с пакетом 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 для работы с вашим локальным базой данных.

Оцените материал
Добавить комментарий

Капча загружается...