是否可以在SQLAlchemy中创建自定义“列”?这会打破OOP吗?

时间:2019-09-15 01:18:03

标签: python sql oop sqlalchemy

我是SQLAlchemy的新手,我想了解一些概念。

这是不带SQLAlchemy的代码示例:

class Token:
    def __init__(self, key):
        # generate token based on a string

class User:
    def __init__(self, name):
        self.name = name
        self.token = Token(name)

    def check_token(token_to_check)
        return self.token.is_valid(token_to_check)

如何将其移至SQLAlchemy?我认为我必须做类似的事情:

class UserDatabase(Base):
    __tablename__ = 'testing_sql_alchemy_v2_users'
    name = Column(String(256))
    token = Column(String(256))

但是,当我获得用户时,令牌将是一个 String 而不是一个 Token 对象。我可以使用对象创建列吗?示例:

token = Column(Token)

如果无法执行此操作,则所有使用数据库的对象都必须仅具有“简单”变量(字符串,整数等)。我认为这会破坏OOP,对吧?

1 个答案:

答案 0 :(得分:2)

在定义模型(Program.Settings s = Program.mySettings; )中的列时,您只能使用您正在使用的数据库引擎中存在的类型。

但是,某些数据库引擎使您可以克服这一困难。

在PostgreSQL中,可以通过纯SQL或使用ORM(例如SQLAlchemy)来定义自己的自定义类型。

class UserDatabase

来源:SQLAlchemy Docs

如您所见,它正在现有类型的基础上实现其他逻辑,因此受到限制。

但是对于您的用例来说,这应该足够了–您可以在import sqlalchemy.types as types class MyType(types.TypeDecorator): '''Prefixes Unicode values with "PREFIX:" on the way in and strips it off on the way out. ''' impl = types.Unicode def process_bind_param(self, value, dialect): return "PREFIX:" + value def process_result_value(self, value, dialect): return value[7:] def copy(self, **kw): return MyType(self.impl.length) 类型的顶部创建自己的类型,并执行一些逻辑以对该字符串进行令牌化。