On Wed, Feb 27, 2019 at 1:16 PM spaceman
<[email protected]> wrote:
>
> Hi,
>
> I am trying to store an IP address in MySQL database using the following 
> mapping:
>
> class IP(Base):
>
>     __tablename__ = 'ip'
>
>     ip = Column(VARBINARY(16), nullable=False, index=True)
>
> VARBINARY is the correct type for storing IP addresses according to:
>
> https://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton
>
> My question is how do I run the MySQL function inet6_aton on insertion
> and inet6_ntoa on read using SQLAlchemy ORM?
>
> I know I could do it with python, but I am assuming that it is faster
> with MySQL.
>
> I am running SQLAlchemy 1.2.18 and MariaDB 10.0.38.
>

You would normally do this by creating a custom column type:

https://docs.sqlalchemy.org/en/latest/core/custom_types.html#types-sql-value-processing

Here's an untested example:

class IPAddress(TypeDecorator):
    impl = VARBINARY(16)
    def bind_expression(self, bindvalue):
        return func.inet6_aton(bindvalue, type_=self)

    def column_expression(self, col):
        return func.inet6_ntoa(col, type_=self)

class IP(Base):
    __tablename__ = 'ip'
    ip = column(IPAddress(), nullable=False, index=True)



Depending on what else you want to do with this column, you may also
want to define a custom Comparator.

Hope that helps,

Simon

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to