Можно ли иметь список или массив в базе данных, используя SQLAlchemy? - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь создать систему, которая позволяет пользователям создавать «проекты». Эти проекты имеют довольно простой синтаксис, им просто нужны идентификатор, имя, опционально описание и участники.

Поскольку я хочу, чтобы пользователи могли добавлять или удалять других пользователей из проекта без необходимости повторного ввода всего списка пользователей, я хочу использовать строку или массив или какой-либо такой метод вместо строки.

Однако, я застрял при попытке ввести его. Сначала я попробовал обычный список, но SQLalchemy этого не принял. После поиска в гугле кажется, что это невозможно? Если я просто не наткнулся на это.

Теперь я пытаюсь использовать массив. Мой текущий код выглядит так:

class DBProject(db.Model):
__tablename__ = 'project'
    project_id = db.Column(db.Integer, primary_key=True)
    project_name = db.Column(db.String(128))
    project_description = db.Column(db.String(255), nullable=True)
    project_participants = db.Column(db.ARRAY(db.Integer))

Но это дает ошибку: в _compiler_dispatch поднять exc.UnsupportedCompilationError (посетитель, cls) sqlalchemy.exc.CompileError: (в таблице 'project', столбец 'project_participants'): компилятор не может отобразить элемент типа

Раньше я пытался опустить (db.Integer) или заменить его просто Integer (потому что я видел это с другими людьми с похожими проблемами), например:

project_participants = db.Column(db.ARRAY(Integer))

Что дает ошибку, что 'Integer' не определено, или, в случае полного исключения, эта ошибка:

TypeError: init () отсутствует 1 обязательный позиционный аргумент: 'Item_type'

Я надеюсь добавить массив в базу данных, чтобы я мог использовать его для добавления новых пользователей или удаления пользователей без необходимости повторного ввода пользователем системы всех разрешенных пользователей, когда он просто хочет добавить или удалить один из них. .

1 Ответ

1 голос
/ 17 апреля 2019

Сначала я настоятельно рекомендую вам сохранить данные ваших участников в дополнительной таблице. Вы можете добавить отношение m: n между вашей таблицей DBProject и вашей таблицей участников. Все остальное было бы против любого наилучшего использования баз данных. Сохранение ваших участников в виде массива в вашей таблице делает невозможным или, по крайней мере, очень неудобным фильтрование по участникам SQL-запроса.

Но если у вас есть веская причина игнорировать эту рекомендацию, вы можете использовать pickle, чтобы SQLAlchemy преобразовывал ваш массив в строку при записи в вашу базу данных.

class DBProject(db.Model):
__tablename__ = 'project'
    project_id = db.Column(db.Integer, primary_key=True)
    project_name = db.Column(db.String(128))
    project_description = db.Column(db.String(255), nullable=True)
    project_participants = db.Column(db.PickleType, nullable=True)

Используя эту конструкцию, вы можете поместить любой объект (если он не превышает определенный максимальный размер базы данных) в поле базы данных.

Сохранить данные:

dbproject_object = DBProject()
dbproject_object.name = "a_name"
dbproject_object.participants = ["you","him","another one"]
session.add(dbproject_object)
session.commit()

Чтение данных:

participants_array = db.session.query(DBProject).filter(name == "a_name").one().participants 

Result:
participants_array : ["you","him","another one"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...