SQLAlchemy ORM для преобразования входных данных при вставке - PullRequest
0 голосов
/ 12 июля 2019

Я хотел бы загрузить записи в Postgres с помощью SQLAlchemy ORM, но я получаю эту ошибку: psycopg2.ProgrammingError: невозможно адаптировать тип 'lxml.objectify.StringElement'

У меня есть модель:

class B2bProduct(Base):
    __tablename__ = 'b2b_product'
    code = Column(String, primary_key=True)

И когда я пытаюсь вставить список продуктов (список диктов, где значения имеют тип 'lxml.objectify.StringElement'):

with session_scope() as s:
    s.bulk_insert_mappings(B2bProduct, prod_list)

Я получаю эту ошибку:

psycopg2.ProgrammingError: can't adapt type 'lxml.objectify.StringElement'

В качестве обходного пути я могу привести все значения в строку Python перед массовой вставкой.Однако я бы предпочел, чтобы кастинг проходил в определении класса B2bProduct.Можно ли использовать декларативное ORM, чтобы оно автоматически преобразовывало любое значение, которое я ему даю, в строку Python (до фактической вставки)?

Примерно так:

code = Column(String, primary_key=True, convert_to_string=True)

Не знаю, но я могу спросить о TypeEngine, который будет выполнять преобразование.Вы можете посоветовать?

1 Ответ

0 голосов
/ 19 июля 2019

Итак, я нашел ответ TypeDecorator, как намекнул Райто. Спасибо.

class Float2(types.TypeDecorator):
    ''' Float Type that replaces commas with  dots on input '''
    impl = types.Float
    def process_bind_param(self, value, dialect):  # insert
        return value.replace(',','.')
    def process_result_value(self, value, dialect):  # select
        return value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...