Hi,
I want to create a custom type for TINYINT and DOUBLE.
I've defined them as custom types.
I want to use with_variant for them, so that in sqlite they print out as
TINYINT and DOUBLE.
But I also want them to use the variants defined for other databases, like
Oracle and Postgres.
The first part works fine, the second part, not so much.
What's really the best way to do this?
Code is attached below.
Brian
from sqlalchemy.ext.compiler import compiles
from sqlalchemy import SmallInteger, Float
from sqlalchemy import types
from sqlalchemy.dialects import mysql, oracle, postgresql
from sqlalchemy import create_engine, MetaData, Column, Boolean
from sqlalchemy.schema import Table
MYSQL = "mysql"
ORACLE = "oracle"
POSTGRES = "postgresql"
SQLITE = "sqlite"
class TINYINT(SmallInteger):
"""The non-standard TINYINT type."""
__visit_name__ = 'TINYINT'
class DOUBLE(Float):
"""The non-standard DOUBLE type."""
__visit_name__ = 'DOUBLE'
@compiles(TINYINT)
def compile_tinyint(type_, compiler, **kw):
return "TINYINT"
@compiles(DOUBLE)
def compile_double(type_, compiler, **kw):
return "DOUBLE"
byte_map = {
MYSQL: mysql.TINYINT(),
ORACLE: oracle.NUMBER(3),
POSTGRES: postgresql.SMALLINT(),
}
double_map = {
MYSQL: mysql.DOUBLE(),
ORACLE: oracle.BINARY_DOUBLE(),
POSTGRES: postgresql.DOUBLE_PRECISION(),
}
def byte(**kwargs):
return _vary(TINYINT(), byte_map, kwargs)
def double(**kwargs):
return _vary(DOUBLE(), double_map, kwargs)
def _vary(type, variant_map, overrides):
for dialect, variant in overrides.items():
variant_map[dialect] = variant
for dialect, variant in variant_map.items():
type.with_variant(variant, dialect)
return type
metadata = MetaData()
t = Table("MyTable", metadata,
Column("my_byte", byte()),
Column("my_double", double())
)
def metadata_dump(sql, *multiparams, **params):
# print or write to log or file etc
print(sql.compile(dialect=engine.dialect))
engine = create_engine("sqlite://", strategy='mock', executor=metadata_dump)
metadata.create_all(engine)
def metadata_dump(sql, *multiparams, **params):
# print or write to log or file etc
print(sql.compile(dialect=engine.dialect))
engine = create_engine("oracle://", strategy='mock', executor=metadata_dump)
metadata.create_all(engine)
--
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.