0

I'm new in SQLAlchemy and I'm trying to understand some concepts.

Here is a code example without 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)

How can I move this to SQLAlchemy?. I think I have to do something like:

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

But, when I get the User, token will be a String instead of a Token object. Can I create a Column with my objects?. Example:

token = Column(Token)

If I can't do this, all my objects that use a database must have only "simple" variables (string, int, etc). I think this breaks OOP, right?.

asked Sep 15, 2019 at 1:18

1 Answer 1

2

When defining columns in a model (class UserDatabase), you are limited to types that exist in the database engine being used by you.

However, some database engines allow you to overcome this difficulty.

In PostgreSQL it is possible to define your own custom types, either by pure SQL or with the usage of ORM such as SQLAlchemy.

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)

source: SQLAlchemy Docs

As you can see it is implementing additional logic on top of already existing types, therefore it is limited.

But for your use case it should be sufficient - you can make your own type on top of varchar type and perform some logic to token-ify that string.

answered Sep 15, 2019 at 9:19

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.