Найти - Пользователи
Полная версия: Неправильно работает array of inet в sqlalchemy.
Начало » Web » Неправильно работает array of inet в sqlalchemy.
1
plusplus
Пишу на flask-е, есть вот такая модель:
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy.dialects.postgresql import ARRAY, INET, Integer, Unicode, Column
db = SQLAlchemy()
class User(db.Model):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    login = Column(Unicode(15))
    password = Column(Unicode(34))
    name = Column(Unicode(100))
    permitted_ips = Column(ARRAY(INET))

Вот какой результат я получаю, когда пытаюсь обратиться к permitted_ips:

user = User.query.get(84)
print user.permitted_ips
#['{', '1', '7', '2', '.', '2', '0', '.', '2', '5', '.', '2', ',', '1', '7', '2', '.', '2', '0', '.', '2', '5', '.', '3', '}']

Column(ARRAY(Unicode)) работает нормально при этом. Версия sqlalchemy 0.9.10, пробовал ставить последнюю - не помогло. Как быть?
sander
plusplus
скорее всего нужно что то подобное дока
plusplus
sander, сделал как-то так:

class INET_ARRAY(ARRAY):
    def bind_processor(self, dialect):
        def process(value):
            if value is None:
                return value
            else:
                return "{%s}" % ','.join(value)
        return process
    def result_processor(self, dialect, coltype):
        item_proc = self.item_type.\
            dialect_impl(dialect).\
            result_processor(dialect, coltype)
        def process(value):
            if value is None:
                return value
            else:
                value = value.replace('{', '').replace('}', '').split(',')
                return self._proc_array(
                    value,
                    item_proc,
                    self.dimensions,
                    tuple if self.as_tuple else list)
        return process

На stackoverflow подсказали вариант попроще: http://stackoverflow.com/questions/37204982/how-to-use-array-of-inet-in-flask-sqlalchemy/37216639#37216639 Но на update он не работает:
    user = User.query.get(84)
    user.permitted_ips = ['172.20.25.2']
    db.session.commit()
    #sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "permitted_ips" is of type inet[] but expression is of type text[]
    #LINE 1: UPDATE passwd SET permitted_ips=ARRAY['172.20.25.2'] WHERE p...
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB