You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.3 KiB
39 lines
1.3 KiB
''' SQL conventions and custom Encoders ''' |
|
|
|
import json |
|
|
|
from sqlalchemy.ext.declarative import declarative_base |
|
from sqlalchemy.schema import MetaData |
|
from sqlalchemy.types import TypeDecorator, Unicode |
|
|
|
# Recommended naming convention used by Alembic, as various different database |
|
# providers will autogenerate vastly different names making migrations more |
|
# difficult. See: http://alembic.zzzcomputing.com/en/latest/naming.html |
|
NAMING_CONVENTION = { |
|
"ix": "ix_%(column_0_label)s", |
|
"uq": "uq_%(table_name)s_%(column_0_name)s", |
|
"ck": "ck_%(table_name)s_%(constraint_name)s", |
|
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", |
|
"pk": "pk_%(table_name)s" |
|
} |
|
|
|
metadata = MetaData(naming_convention=NAMING_CONVENTION) |
|
Base = declarative_base(metadata=metadata) |
|
|
|
|
|
class JsonEncoder(TypeDecorator): |
|
''' Custom type for storing data structures as json-encoded string. ''' |
|
|
|
impl = Unicode |
|
|
|
def process_bind_param(self, value, dialect): |
|
''' inbound (to database) ''' |
|
if value is not None: |
|
value = json.dumps(value) |
|
return value |
|
|
|
def process_result_value(self, value, dialect): |
|
''' outbound (from database) ''' |
|
if value is not None: |
|
value = json.loads(value) |
|
return value
|
|
|