Postgresql 如何在炼金术中使用INET数组?

Postgresql 如何在炼金术中使用INET数组?,postgresql,flask,sqlalchemy,Postgresql,Flask,Sqlalchemy,我的flask应用程序中有一个带有ips字段数组的用户模型。我想使用inet类型的postgresql数组: from flask.ext.sqlalchemy import SQLAlchemy from sqlalchemy.dialects.postgresql import ARRAY, INET, Integer, Unicode, Column db = SQLAlchemy() class User(db.Model): __tablename__ = 'users'

我的flask应用程序中有一个带有ips字段数组的用户模型。我想使用inet类型的postgresql数组:

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))
但当我提出疑问时,我得到了错误的答案:

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', '}']

而不是['172.20.25.2','172.20.25.3']。sqlalchemy的当前版本是0.9.10。我试了最新的一个,但结果是一样的。有可能解决这个问题吗?

我发现数组不会自动解析,所以您需要创建一个带有psycopg2的库

# needed imports
from psycopg2 import STRING
from psycopg2.extensions import register_type, new_array_type
注册数组类型时,将执行一次

# to see the oid of inet. As pointed out by @univerio the oid should never             
# change, so you don't need to fetch it every time your app starts.
tp = db.engine.execute("select typarray from pg_type where typname = 'inet'")
print(tp.fetchone())
# (1041,)

# registering the array type
register_type(new_array_type((1041,), 'INET[]', STRING))
现在,您可以获取数组并正确解析它

# fetch data
ips = db.engine.execute("select permitted_ips from users where id = 1")
print(ips.fetchone()[0])
# ['172.20.25.2', '172.20.25.3'].

注册数组类型肯定比临时解析“错误”字符串更干净。你是说更安全?我不是专家,你能解释一下吗?不,它更干净。如果您必须在需要访问user.allowed_ips的任何地方进行这种特殊转换,那么在您对对象进行设置之前自动进行转换不是很好吗?这也是为什么它不只是给你整数作为字符串,每次都要求你做
int(user.id)
。谢谢,现在我知道了。当我说这更干净,因为我建议使用SQL而不是ORM本身,我认为这很混乱。。。不管怎样,也许有一种方法可以用sqlalchemy做到这一点,我会再做一次我的研究,thaks!我懂了。内置类型的oid永远不会改变,所以你不必每次启动应用程序时都从PostgreSQL获取oid。