Как исправить ошибку «Неверный синтаксис ввода для целых чисел» при использовании sqlalchemy декларативного API - PullRequest
0 голосов
/ 12 мая 2019

На самом деле я создаю несколько утилит, которые стремятся взять плоский файл csv / excel и заполнить целевую базу данных в MS Access - поскольку я работаю на Mac, я разрабатываю его с помощью Postgres ...

Итак, я разработал часть, которая имеет дело с беспорядочными формами ввода (csv / excel) (несколько заголовков и т. Д.), Но на данный момент это не моя проблема.

С другой стороны, я сделал свою базу данныхмодель с использованием API-интерфейса декларативной базы SQLAlchemy.

При импорте данных в несколько таблиц я сталкиваюсь с проблемой: - Разбить плоскую запись на несколько объектов - Проверить (ВЫБРАТЬ), если запись еще не существует на основе ограничений уникальности -Если он не существует, я создаю объект, иначе я использую существующий - распространять информацию о ключах к связанному объекту

Для некоторых таблиц я использую аргументы auto_increment, но иногда запись имеет свой собственный идентификатор (во входном файле) поэтому я должен использовать его для вставки / выбора в моих таблицах, а иногда и без идентификатора, поэтому мне нужно создать новый технический идентификатор для моей таблицы.

Пример: у меня естьзапись для первичного ключа -obsr25644-, а иногда и ничего, поэтому я использую значение по умолчанию, созданное с помощью uuid.

Таким образом, ниже трассировки стека при выполнении операции select для моей таблицы.Та же ошибка возникает при работе с существующими данными - obsr25644 - и сгенерированным uuid - 'a8098c1a-f86e-11da-bd1a-00112444be1e'

sqlalchemy.exc.DataError: (psycopg2.errors.InvalidTextRepresentation) **invalid input syntax for integer**: "obsr25644"
LINE 3: WHERE "Location"."Id_observer" = 'obsr25644' 

Как вы можете видеть ниже, "Location". "Id_observer"объявлен как строка (255).Я не понимаю, почему ошибка связана с 'integer'.

[SQL: SELECT "Location"."Id_location" AS "Location_Id_location", [...], "Location"."Id_observer" AS "Location_Id_observer", 
FROM "Location" 
WHERE "Location"."Id_observer" = %(Id_observer_1)s 
 LIMIT %(param_1)s]
[parameters: {'Id_observer_1': 'obsr25644', 'param_1': 1}]
class LocationModel(UniqueMixin, Base):
    __tablename__ = 'Location'
    # Primary key
    Id_location = Column(Integer, primary_key=True, autoincrement=True)
    [...]
    Id_observer = Column(String(255), ForeignKey('Observer.Id_observer'))
    observer = relationship("ObserverModel", load_on_pending=True, back_populates="location")
class ObserverModel(UniqueMixin, Base):
    __tablename__ = 'Observer'
    # Primary key
    Id_observer = Column(String(255), primary_key=True, default=UniqueMixin.unique_hash())
    [...]
    # Relationship
    location = relationship("LocationModel", load_on_pending=True, back_populates="observer")

Примечание: UniqueMixin.unique_hash () возвращает uuid.uuid4 (). Hex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...