我是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,对吧?
答案 0 :(得分:2)
在定义模型(Program.Settings s = Program.mySettings;
)中的列时,您只能使用您正在使用的数据库引擎中存在的类型。
但是,某些数据库引擎使您可以克服这一困难。
在PostgreSQL中,可以通过纯SQL或使用ORM(例如SQLAlchemy)来定义自己的自定义类型。
class UserDatabase
如您所见,它正在现有类型的基础上实现其他逻辑,因此受到限制。
但是对于您的用例来说,这应该足够了–您可以在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)
类型的顶部创建自己的类型,并执行一些逻辑以对该字符串进行令牌化。