SqlAlchemy поддерживает большинство типов данных, специфичных для базы данных, через диалекты, но я не смог найти ничего, что могло бы работать с типом столбца postgresql xml. Кто-нибудь знает рабочее решение. В идеале для него не требуется отдельная реализация типа столбцов.Использование типа данных postgresql xml с sqlalchemy
3
A
ответ
0
См: SQLAlchemy TypeDecorator doesn't work
Здесь же решение модифицировано для обработки XmlType для оракула любой длиной XML и позволить LXML etree задания и из колонки класса (нет необходимости deparse/повторный обработки XML из контейнерных классов)
# coding: utf-8
from sqlalchemy import Column, DateTime, Float, ForeignKey, Index, Numeric, String, Table, Text, CLOB
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql.functions import GenericFunction
class XMLTypeFunc(GenericFunction):
type=CLOB
name='XMLType'
identifier='XMLTypeFunc'
from sqlalchemy.types import TypeDecorator
from lxml import etree #you can use built-in etree if you want
class XMLType(TypeDecorator):
impl = CLOB
type = 'XMLTYPE' #etree.Element
def get_col_spec(self):
return 'XMLTYPE'
def bind_processor(self, dialect):
def process(value):
if value is not None:
return etree.tostring(value, encoding='UTF-8', pretty_print='True')
#return etree.dump(value)
else:
return None
return process
def process_result_value(self, value, dialect):
if value is not None:
value = etree.fromstring(value)
return value
def bind_expression(self, bindvalue):
return XMLTypeFunc(bindvalue)
0
Если вам нужно иметь собственный тип «XML» данных в базе данных PostgreSQL, вам нужно написать специальный тип, который унаследованный от UserDefinedType не из TypeDecorator. Documentation
Вот что я использовал в одном из проектов:
class XMLType(sqlalchemy.types.UserDefinedType):
def get_col_spec(self):
return 'XML'
def bind_processor(self, dialect):
def process(value):
if value is not None:
if isinstance(value, str):
return value
else:
return etree.tostring(value)
else:
return None
return process
def result_processor(self, dialect, coltype):
def process(value):
if value is not None:
value = etree.fromstring(value)
return value
return process
Смежные вопросы
- 1. Преимущество типа Postgresql XML?
- 2. Подключение postgresql с sqlalchemy
- 3. SQLAlchemy/PostgreSQL измененный, дедуплицированный массив
- 4. «Unicode» против «String» с SQLAlchemy и PostgreSQL
- 5. Postgresql: Использование типа индекса в качестве типа данных?
- 6. SQLAlchemy выбора выражений типа данных
- 7. Использование cdecimal в SQLAlchemy
- 8. Использование EclipseLink JPA для хранения типа XML для PostgreSQL
- 9. Запрос PostgreSQL ILIKE с SQLAlchemy
- 10. Многомерные массивы PostgreSQL в SQLAlchemy
- 11. Как представить пользовательский домен PostgreSQL в SQLAlchemy?
- 12. Отображение SQLALCHEMY-POSTGRESQL
- 13. Использование pysqlcipher с SqlAlchemy?
- 14. Django, PostgreSQL и SQLAlchemy
- 15. SQLAlchemy + PostgreSQL + PG REGEX
- 16. Использование двух баз данных с Pyramid SqlAlchemy
- 17. SQLAlchemy and Postgresql: to_tsquery()
- 18. SQLAlchemy, пул соединений PostgreSQL
- 19. Подключение к локально postgresql с использованием sqlalchemy
- 20. Использование типа денег PostgreSQL вместо numeric
- 21. Использование пользовательского кодировщика JSON для реализации PostgreSQL JSONB для SQLAlchemy
- 22. Тип ENUM в SQLAlchemy с PostgreSQL
- 23. Использование типа данных для 10-20-значного значения - PostgreSQL
- 24. Откат транзакций базы данных в тестах SQLAlchemy с PostgreSQL
- 25. Утечка соединений с базами данных: PostgreSQL, SQLAlchemy, Flask
- 26. SQLAlchemy явная блокировка Postgresql таблицы
- 27. SQLAlchemy: массив PostGreSQL пользовательских типов
- 28. SQLAlchemy default PostgreSQL ARRAY поведение
- 29. Импорт XML-данных в PostgreSQL
- 30. Переход к PostgreSQL «XML» тип данных
Я не вижу, что реализуется в PostGreSQL диалектов с SQLAlchemy 0.8. Вы можете попробовать использовать рефлексию для загрузки существующей схемы psql с помощью столбца XML и посмотреть, как ее обрабатывает грамотно sqlalchemy. Но даже в лучшем случае я не думаю, что вы получите хорошие вещи, такие как индексирование XPATH, даже если отражение действительно делает что-то изящное, как выставляя столбец как тип текста. Попробуйте подать запрос на повышение в трекер-вопроснике sqlalchemy. – JosefAssad
Посмотрите также пример использования zzzeek для использования списка смежности для хранения данных XML: https://bitbucket.org/sqlalchemy/sqlalchemy/src/2a4318815eb13a8d9f58bcf7009b115f2c8a839d/examples/elementtree/optimized_al.py?at=default – JosefAssad
мы стараемся полагаться на psycopg2, насколько это возможно для этих типов, в то время как они поддерживают JSON и HSTORE, у них нет типа XML: http://initd.org/psycopg/docs/extras.html#additional-data-types. что вы все еще можете получить много функциональности здесь, используя techinques по адресу http://docs.sqlalchemy.org/en/rel_0_8/core/types.html#types-custom, и мы, конечно же, будем принимать запросы на получение завершенного кода. – zzzeek