class DBVideoQueue(BaseModel):

    __tablename__ = 'videos_queue'

    video_name = Column(VARCHAR(4096))
    hash_video = Column(VARCHAR(100))
    is_in_progress = Column(BOOLEAN(), nullable=False, default=False)
    is_done = Column(BOOLEAN(), nullable=False, default=False)
    is_delete = Column(BOOLEAN(), nullable=False, default=False)
Example #2
0
class DBMessage(BaseModel):

    __tablename__ = 'messages'

    sender_id = Column(Integer, nullable=False)
    recipient_id = Column(Integer, nullable=False)
    message = Column(TEXT)
    is_delete_sender = Column(BOOLEAN(), nullable=False, default=False)
    is_delete_recipient = Column(BOOLEAN(), nullable=False, default=False)
Example #3
0
class WithdrawConfig(ORMBase):
    """
    提币配置表
    """


    __tablename__ = 'tb_withdraw_config'


    #关于外键:
    #   https://blog.csdn.net/lucyxu107/article/details/81743529
    #  https://www.cnblogs.com/chen1930/p/6224676.html

    # pro_id = Column(key='pro_id', type_=Integer(), nullable=False, comment='项目方id')
    id = Column( key='id', type_=Integer(), primary_key=True, autoincrement=True , comment='id 自增')
    token_name = Column(key='token_name', type_=String(20),  nullable=False, comment='币种名')
    address = Column(key='address', type_=String(100),  nullable=False, comment='出币地址' )
    min_amount = Column( key='min_amount', type_= DECIMAL(precision=28, scale=8, decimal_return_scale=8, asdecimal=True), nullable=False, comment='最大提币金额'  )
    max_amount = Column( key='max_amount', type_= DECIMAL(precision=28, scale=8, decimal_return_scale=8, asdecimal=True), nullable=False, comment='最小提币金额'  )
    balance_threshold_to_sms = Column( key='balance_threshold_to_sms', type_= DECIMAL(precision=28, scale=8, decimal_return_scale=8, asdecimal=True), nullable=False, comment='短信通知阈值'  )
    is_open  =   Column( key='is_open', type_=BOOLEAN(), nullable=True, comment='提币通过是否开启' )

    # pro_id =  Column(Integer(), ForeignKey('tb_project.pro_id'))
    pro_id =  Column(Integer(), ForeignKey(Project.pro_id, ondelete='CASCADE'), comment='项目方ID')
    project = relationship("Project", backref='withdraw_config_ref_project')

    __table_args__ = (
        UniqueConstraint('token_name', 'pro_id', name='uidx_token_name_pro_id'),  #联合唯一索引
    )
Example #4
0
def _createMonitorErrorFlagsSchema(schemaName, metadata):
    schema = Table(
        schemaName,
        metadata,

        # Issue UID
        Column("uid",
               mysql.VARCHAR(length=_MAX_MONITOR_ISSUES_ID_LEN),
               primary_key=True,
               nullable=False),
        PrimaryKeyConstraint("uid", name=schemaName + "_pk"),

        # Issue name
        Column("name",
               mysql.VARCHAR(length=_MAX_MONITOR_ISSUES_ID_LEN),
               nullable=False),

        # Should report issue flag
        Column("should_report", BOOLEAN(), nullable=False),

        # Datetime of last issue occurrence
        Column("last_occurrence",
               DATETIME(),
               nullable=False,
               server_default=func.current_timestamp()),

        # Count of issue occurrences
        Column("occurrence_count", INTEGER, nullable=True, autoincrement=True),
        mysql_CHARSET=MYSQL_CHARSET,
        mysql_COLLATE=MYSQL_COLLATE,
    )
    return schema
Example #5
0
class BaseModel(Base):

    __abstract__ = True

    id = Column(
        Integer,
        nullable=False,
        unique=True,
        primary_key=True,
        autoincrement=True
    )

    created_at = Column(
        TIMESTAMP,
        nullable=False,
        default=datetime.datetime.utcnow
    )

    update_at = Column(
        TIMESTAMP,
        nullable=False,
        default=datetime.datetime.utcnow,
        onupdate=datetime.datetime.utcnow
    )

    is_delete = Column(
        BOOLEAN(),
        nullable=False,
        default=False)

    def __repr__(self):
        return f'{self.__class__.__name__}'
Example #6
0
class DBMessage(BaseModel):
    __tablename__ = 'message'

    sender_id = Column(Integer, ForeignKey('user.id'), nullable=False)
    recipient_id = Column(Integer, ForeignKey('user.id'), nullable=False)
    message = Column(NVARCHAR(), nullable=False)
    is_delete = Column(BOOLEAN(), nullable=False, default=False)
Example #7
0
class Assignment(Base):
    'An nbgrader assignment'
    __tablename__ = 'assignments'
    # in case assignment name needs to be changed
    _id = Column(INTEGER, primary_key=True)
    id = Column(TEXT)
    course_id = Column(INTEGER, ForeignKey("courses._id"))
    submissions = relationship("Submission", backref="assignment")
    files = relationship("File", secondary=assignment_files_assoc_table)
    released = BOOLEAN()
    due = Column(TIMESTAMP)

    # TODO: timezoon

    def __init__(self, name, course):
        'Initialize with assignment name and course'
        self.id = name
        self.course = course

    def __str__(self):
        return '<Assignment %s>' % self.id

    def delete(self, db):
        'Remove assignment and dependent data (files, submissions)'
        for file_obj in self.files:
            file_obj.delete(db)
        for submission in self.submissions:
            submission.delete(db)
        db.delete(self)
Example #8
0
class DBMessage(BaseModel):
    __tablename__ = 'message'

    user_message = Column(VARCHAR(200), nullable=False)
    recipient = Column(VARCHAR(50), nullable=False)
    sender_id = Column(INT, nullable=False)
    recipient_id = Column(INT, nullable=False)
    is_deleted = Column(BOOLEAN(), nullable=False, default=False)
Example #9
0
class DBMessage(BaseModel):

    __tablename__ = 'messages'

    sender_id = Column(INTEGER(), nullable=False)
    recipient_id = Column(INTEGER(), nullable=False)
    message = Column(VARCHAR())
    is_delete = Column(BOOLEAN(), nullable=False, default=False)
class DBUser(BaseModel):

    __tablename__ = 'users'
    login = Column(VARCHAR(20), unique=True, nullable=False)
    password = Column(LargeBinary(), nullable=False)
    first_name = Column(VARCHAR(50))
    last_name = Column(VARCHAR(50))
    is_delete = Column(BOOLEAN(), nullable=False, default=False)
Example #11
0
 def test_boolean(self):
     for type_, expected in [
         (BOOLEAN(), "BOOL"),
         (Boolean(), "BOOL"),
         (mysql.TINYINT(1), "TINYINT(1)"),
         (mysql.TINYINT(1, unsigned=True), "TINYINT(1) UNSIGNED"),
     ]:
         self.assert_compile(type_, expected)
Example #12
0
class DBUser(BaseModel):

    __tablename__ = 'users'

    login = Column(VARCHAR(255), nullable=False, unique=True)
    password = Column(VARBINARY(), nullable=False)
    first_name = Column(VARCHAR(255))
    last_name = Column(VARCHAR(255))
    is_delete = Column(BOOLEAN(), nullable=False, default=False)
Example #13
0
class DBEmployee(BaseModel):
    __tablename__ = 'employees'

    login = Column(VARCHAR(20), unique=True, nullable=False)
    password = Column(VARBINARY(), nullable=False)
    first_name = Column(VARCHAR(50))
    last_name = Column(VARCHAR(50))
    is_delete = Column(BOOLEAN(), nullable=False, default=False)
    position = Column(VARCHAR(50))
    department = Column(VARCHAR(50))
Example #14
0
class User(Base):
    __tablename__= "Users"
    uuid = Column(CHAR(36), primary_key=True)
    firstname = Column(VARCHAR(45))
    lastname = Column(VARCHAR(45))
    fb_access_token = Column(VARCHAR(255))
    fb_email = Column(VARCHAR(45))
    fb_id = Column(BIGINT)
    active = Column(BOOLEAN())
    recipients = relationship("Recipient", secondary=association_table, back_populates="users")
class Utility(Base):
    """ Utility model to store utility(shop) details.
    """

    __tablename__ = 'utility'

    id = Column('id', Integer, primary_key=True, autoincrement=True)
    name = Column('name', String(255), nullable=False)
    description = Column('description', String(512), nullable=False)
    image = Column('image', String(512))
    user_utility_id = Column(Integer, ForeignKey('user.id'), nullable=False)
    utility_item = relationship('UtilityItem')
    address = Column('address', String(512), nullable=False)
    approval_count = Column('approval_count', Integer, default=0)
    registered = Column('registered', BOOLEAN(), default=False)

    # define methods for Utility model
    def __init__(self, **kwargs):
        super(Utility, self).__init__(**kwargs)

    def create(self):
        """ Adds new utility to db.
        """
        session.add(self)
        session.commit()

    def get(self, id):
        """ Returns the Utility data for the specified id.
        
        :param id: id for the requested Utility.
        :param type: int
        """
        return session.query(Utility).filter(Utility.id == id).first()

    def all(self):
        """ Returns all utilities in db.
        """
        return session.query(Utility).all()

    def save(self):
        """ Updates the Utility in db.
        """
        session.commit()

    def get_user_utility(self, id):
        """ Gets user id owned utilities.
        """
        return session.query(Utility).filter(
            Utility.user_utility_id == id).all()

    def get_owner(self, id):
        """ Returns the id for the utility owner.
        """
        owner = session.query(Utility).filter(Utility.id == id).first()
        return owner.id
Example #16
0
    def test_type_reflection(self):
        metadata = self.metadata

        # (ask_for, roundtripped_as_if_different)

        specs = [
            (String(), String()),
            (String(1), String(1)),
            (String(3), String(3)),
            (Text(), Text()),
            (Unicode(), String()),
            (Unicode(1), String(1)),
            (Unicode(3), String(3)),
            (UnicodeText(), Text()),
            (CHAR(1), ),
            (CHAR(3), CHAR(3)),
            (NUMERIC, NUMERIC()),
            (NUMERIC(10, 2), NUMERIC(10, 2)),
            (Numeric, NUMERIC()),
            (Numeric(10, 2), NUMERIC(10, 2)),
            (DECIMAL, DECIMAL()),
            (DECIMAL(10, 2), DECIMAL(10, 2)),
            (INTEGER, INTEGER()),
            (BIGINT, BIGINT()),
            (Float, Float()),
            (NUMERIC(), ),
            (TIMESTAMP, TIMESTAMP()),
            (DATETIME, DATETIME()),
            (DateTime, DateTime()),
            (DateTime(), ),
            (DATE, DATE()),
            (Date, Date()),
            (TIME, TIME()),
            (Time, Time()),
            (BOOLEAN, BOOLEAN()),
            (Boolean, Boolean()),
            ]
        columns = [Column('c%i' % (i + 1), t[0]) for (i, t) in
                   enumerate(specs)]
        db = testing.db
        t_table = Table('types', metadata, *columns)
        metadata.create_all()
        m2 = MetaData(db)
        rt = Table('types', m2, autoload=True)
        try:
            db.execute('CREATE VIEW types_v AS SELECT * from types')
            rv = Table('types_v', m2, autoload=True)
            expected = [len(c) > 1 and c[1] or c[0] for c in specs]
            for table in rt, rv:
                for i, reflected in enumerate(table.c):
                    assert isinstance(reflected.type,
                            type(expected[i])), '%d: %r' % (i,
                            type(expected[i]))
        finally:
            db.execute('DROP VIEW types_v')
class DBFile(BaseModel):

    __tablename__ = 'files'

    sender_id = Column(
        Integer,
        ForeignKey('users.id'),
        nullable=False,
    )
    ref_file = Column(VARCHAR(4096))
    is_delete = Column(BOOLEAN(), nullable=False, default=False)
Example #18
0
class DBMessage(BaseModel):
    __tablename__ = "messages"

    sender_id = Column(Integer(),
                       ForeignKey('employees.id', ondelete='CASCADE'),
                       nullable=False)
    recipient_id = Column(Integer(),
                          ForeignKey('employees.id', ondelete='CASCADE'),
                          nullable=False)
    message = Column(VARCHAR(280))  # Как в Твитторе
    is_delete = Column(BOOLEAN(), nullable=False, default=False)
Example #19
0
class Device(Base):
    """
    Update class that represents a device update
    """
    __tablename__ = 'devices'
    id: int = Column(INT(),
                     primary_key=True,
                     autoincrement=True,
                     nullable=False)
    name: str = Column(VARCHAR(40))
    codename: str = Column(VARCHAR(30), nullable=False)
    region: str = Column(VARCHAR(30))
    miui_name: str = Column(VARCHAR(30))
    miui_code: str = Column(VARCHAR(6))
    mi_website_id: int = Column(INT())
    picture: str = Column(TEXT())
    eol: bool = Column(BOOLEAN(), default=False)
    firmware_updater = Column(BOOLEAN(), default=True, nullable=False)

    def __repr__(self):
        return f"<Device(codename={self.codename}, name={self.name}, region={self.region})>"
Example #20
0
class Report(db.Model):
    __tablename__ = 'reports'

    id = Column(INTEGER(11), primary_key=True)
    persons_id = Column(ForeignKey('persons.id'), nullable=False, index=True)
    campaigns_id = Column(ForeignKey('campaigns.id'),
                          nullable=False,
                          index=True)
    email_sent = Column(BOOLEAN(4))  #ANTES ERA TINYINT
    sms_sent = Column(BOOLEAN(4))

    campaigns = relationship('Campaign')
    persons = relationship('Person')

    def serialize(self):
        return {
            "id": self.id,
            "persons_id": self.persons_id,
            "campaigns_id": self.campaigns_id,
            "email_sent": self.email_sent,
            "sms_sent": self.sms_sent,
        }
Example #21
0
class Contact(Base):
    __tablename__ = 'contact'
    id = Column(Integer, primary_key=True, autoincrement=True)
    user = Column(String(250), nullable=False)
    name = Column(String(250), nullable=False)
    phone = Column(BIGINT(), nullable=False)
    order = Column(Integer(), nullable=False)
    created_time = Column(DateTime(), nullable=False)
    modified_time = Column(DateTime(), nullable=False)
    is_deleted = Column(BOOLEAN(), nullable=False)

    def is_primary(self):
        return int(self.order) == ContactOrder.PRIMARY
Example #22
0
class DBMessage(BaseModel):

    __tablename__ = 'messages'

    id = BaseModel.id
    created_at = BaseModel.created_at
    updated_at = BaseModel.updated_at
    message = Column(VARCHAR(200))

    sender_id = Column(Integer, nullable=False)

    recipient_id = Column(Integer, nullable=False)

    is_delete = Column(BOOLEAN(), nullable=False, default=False)
Example #23
0
def get_table(metadata):
    return Table(
        'devices',
        metadata,
        Column('id',
               INT(),
               primary_key=True,
               autoincrement=True,
               nullable=False),
        Column('name', VARCHAR(40), nullable=False),
        Column('codename',
               VARCHAR(30),
               nullable=False,
               index=True,
               onupdate="CASCADE"),
        Column('region', VARCHAR(30), nullable=False),
        Column('miui_name', VARCHAR(30), nullable=False),
        Column('miui_code', VARCHAR(6), nullable=False),
        Column('mi_website_id', INT(), nullable=True),
        Column('picture', TEXT(), nullable=True),
        Column('eol', BOOLEAN(), default=False, nullable=False),
        Column('firmware_updater', BOOLEAN(), default=True, nullable=False),
    )
Example #24
0
class DBMsgFile(BaseModel):

    __tablename__ = 'msgs_to_files'

    msg_id = Column(
        Integer,
        ForeignKey('messages.id'),
        nullable=False,
    )
    file_id = Column(
        Integer,
        ForeignKey('files.id'),
        nullable=False,
    )
    is_delete = Column(BOOLEAN(), nullable=False, default=False)
Example #25
0
class Assignment(Base):
    'An nbgrader assignment'
    __tablename__ = 'assignments'
    # in case assignment name needs to be changed
    _id = Column(INTEGER, primary_key=True)
    id = Column(TEXT)
    course_id = Column(INTEGER, ForeignKey('courses._id'))
    submissions = relationship('Submission', backref='assignment')
    files = relationship('File', secondary=assignment_files_assoc_table)
    released = BOOLEAN()
    due = Column(TIMESTAMP)

    # TODO: timezoon

    def __init__(self, name, course):
        'Initialize with assignment name and course'
        self.id = name
        self.course = course

    def __str__(self):
        return '<Assignment %s>' % self.id

    def dump(self):
        'Dump data to dict'
        return {
            '_id': self._id,
            'id': self.id,
            'course_id': self.course_id,
            'released': bool(self.released),
            'due': self.due and self.due.strftime('%Y-%m-%d %H:%M:%S.%f %Z'),
        }

    def delete(self, db):
        'Remove assignment and dependent data (files, submissions)'
        for file_obj in self.files[:]:
            file_obj.delete(db)
            self.files.remove(file_obj)
        for submission in self.submissions[:]:
            submission.delete(db)
            self.submissions.remove(submission)
        db.delete(self)
Example #26
0
class Transaction(Base):
    """Database model to track bank transactions."""

    __tablename__ = 'transactions'
    t_id = Column(Text(), primary_key=True)
    account_id = Column(Text(), nullable=False)
    item_id = Column(Text(), nullable=False)
    t_type = Column(Text())
    t_date = Column(DateTime())
    name = Column(Text())
    amount = Column(Numeric(12, 2), nullable=False)
    category = Column(ARRAY(String))
    category_id = Column(Text())
    category_uid = Column(Text())
    address = Column(Text(), default=None)
    city = Column(Text(), default=None)
    state = Column(Text(), default=None)
    zipcode = Column(Text(), default=None)
    pending = Column(BOOLEAN(), default=False)
    pending_trans_id = Column(Text(), default=None)
    refnum = Column(Text())
class DBProgress(BaseModel):

    __tablename__ = 'progress'

    queue_id = Column(
        Integer,
        ForeignKey('videos_queue.id'),
        nullable=False,
    )
    progress_percentage = Column(
        Integer,
        nullable=False,
    )
    violations_num = Column(
        Integer,
        nullable=False,
        default=0
    )
    is_delete = Column(
        BOOLEAN(),
        nullable=False,
        default=False
    )
Example #28
0
class User(Base):
    """Database model for users."""

    __tablename__ = 'users'
    id = Column(Text(), primary_key=True)
    active = Column(BOOLEAN(), default=True)
    balances = Column(JSON)
    balances_update = Column(DateTime())
    personal = Column(JSON, nullable=False)
    personal_update = Column(DateTime())
    income = Column(BigInteger())
    income_update = Column(DateTime())
    spending = Column(JSON)
    spending_update = Column(DateTime())
    goals = Column(JSON)
    goals_update = Column(DateTime())
    notices = Column(JSON)
    notices_update = Column(DateTime())
    categories = Column(JSON)
    categories_update = Column(DateTime())
    catrules = Column(JSON)
    catrules_update = Column(DateTime())
    created_on = Column(DateTime(), default=datetime.datetime.utcnow())
Example #29
0
class Client(IntId, Migrated, Audited, Base):
    name = Column(TextLine, nullable=False)

    reduced_fee = Column(types.String(20))

    # TODO: phase this out.
    note = Column(TEXT())

    address = Column(TextLine)
    city = Column(types.String(24))
    state = Column(types.String(3))
    zip = Column(types.String(12))

    phone = Column(types.String(15))
    DOB = Column(DATE)
    Officer_id = Column(INTEGER(),
                        ForeignKey('Officer.id', ondelete="SET NULL"))
    Officer2_id = Column(INTEGER(),
                         ForeignKey('Officer.id', ondelete="SET NULL"))
    Lawyer_id = Column(INTEGER(),
                       ForeignKey('Officer.id', ondelete="SET NULL"))
    Court_id = Column(INTEGER(),
                      ForeignKey('Office.id', ondelete="SET NULL"))
    file = Column(TextCode)
    file_site = Column(Enum('op', 'kck'))
    file_opened = Column(DATE())
    billing_cutoff = Column(DATE())
    recent = Column(DATE())
    charges = Column(Money)
    client_paid = Column(Money)
    insurance_paid = Column(Money)
    balance = Column(Money)
    balance_cached = Column(TIMESTAMP())
    invoice_note = Column(TEXT())
    voucher = Column(BOOLEAN())
    voucher_note = Column(TextLine)
Example #30
0
class TypeCompileTest(fixtures.TestBase, AssertsCompiledSQL):
    __dialect__ = mysql.dialect()

    @testing.combinations(
        # column type, args, kwargs, expected ddl
        # e.g. Column(Integer(10, unsigned=True)) ==
        # 'INTEGER(10) UNSIGNED'
        (mysql.MSNumeric, [], {}, "NUMERIC"),
        (mysql.MSNumeric, [None], {}, "NUMERIC"),
        (mysql.MSNumeric, [12], {}, "NUMERIC(12)"),
        (
            mysql.MSNumeric,
            [12, 4],
            {
                "unsigned": True
            },
            "NUMERIC(12, 4) UNSIGNED",
        ),
        (
            mysql.MSNumeric,
            [12, 4],
            {
                "zerofill": True
            },
            "NUMERIC(12, 4) ZEROFILL",
        ),
        (
            mysql.MSNumeric,
            [12, 4],
            {
                "zerofill": True,
                "unsigned": True
            },
            "NUMERIC(12, 4) UNSIGNED ZEROFILL",
        ),
        (mysql.MSDecimal, [], {}, "DECIMAL"),
        (mysql.MSDecimal, [None], {}, "DECIMAL"),
        (mysql.MSDecimal, [12], {}, "DECIMAL(12)"),
        (mysql.MSDecimal, [12, None], {}, "DECIMAL(12)"),
        (
            mysql.MSDecimal,
            [12, 4],
            {
                "unsigned": True
            },
            "DECIMAL(12, 4) UNSIGNED",
        ),
        (
            mysql.MSDecimal,
            [12, 4],
            {
                "zerofill": True
            },
            "DECIMAL(12, 4) ZEROFILL",
        ),
        (
            mysql.MSDecimal,
            [12, 4],
            {
                "zerofill": True,
                "unsigned": True
            },
            "DECIMAL(12, 4) UNSIGNED ZEROFILL",
        ),
        (mysql.MSDouble, [None, None], {}, "DOUBLE"),
        (
            mysql.MSDouble,
            [12, 4],
            {
                "unsigned": True
            },
            "DOUBLE(12, 4) UNSIGNED",
        ),
        (
            mysql.MSDouble,
            [12, 4],
            {
                "zerofill": True
            },
            "DOUBLE(12, 4) ZEROFILL",
        ),
        (
            mysql.MSDouble,
            [12, 4],
            {
                "zerofill": True,
                "unsigned": True
            },
            "DOUBLE(12, 4) UNSIGNED ZEROFILL",
        ),
        (mysql.MSReal, [None, None], {}, "REAL"),
        (mysql.MSReal, [12, 4], {
            "unsigned": True
        }, "REAL(12, 4) UNSIGNED"),
        (mysql.MSReal, [12, 4], {
            "zerofill": True
        }, "REAL(12, 4) ZEROFILL"),
        (
            mysql.MSReal,
            [12, 4],
            {
                "zerofill": True,
                "unsigned": True
            },
            "REAL(12, 4) UNSIGNED ZEROFILL",
        ),
        (mysql.MSFloat, [], {}, "FLOAT"),
        (mysql.MSFloat, [None], {}, "FLOAT"),
        (mysql.MSFloat, [12], {}, "FLOAT(12)"),
        (mysql.MSFloat, [12, 4], {}, "FLOAT(12, 4)"),
        (mysql.MSFloat, [12, 4], {
            "unsigned": True
        }, "FLOAT(12, 4) UNSIGNED"),
        (mysql.MSFloat, [12, 4], {
            "zerofill": True
        }, "FLOAT(12, 4) ZEROFILL"),
        (
            mysql.MSFloat,
            [12, 4],
            {
                "zerofill": True,
                "unsigned": True
            },
            "FLOAT(12, 4) UNSIGNED ZEROFILL",
        ),
        (mysql.MSInteger, [], {}, "INTEGER"),
        (mysql.MSInteger, [4], {}, "INTEGER(4)"),
        (mysql.MSInteger, [4], {
            "unsigned": True
        }, "INTEGER(4) UNSIGNED"),
        (mysql.MSInteger, [4], {
            "zerofill": True
        }, "INTEGER(4) ZEROFILL"),
        (
            mysql.MSInteger,
            [4],
            {
                "zerofill": True,
                "unsigned": True
            },
            "INTEGER(4) UNSIGNED ZEROFILL",
        ),
        (mysql.MSBigInteger, [], {}, "BIGINT"),
        (mysql.MSBigInteger, [4], {}, "BIGINT(4)"),
        (mysql.MSBigInteger, [4], {
            "unsigned": True
        }, "BIGINT(4) UNSIGNED"),
        (mysql.MSBigInteger, [4], {
            "zerofill": True
        }, "BIGINT(4) ZEROFILL"),
        (
            mysql.MSBigInteger,
            [4],
            {
                "zerofill": True,
                "unsigned": True
            },
            "BIGINT(4) UNSIGNED ZEROFILL",
        ),
        (mysql.MSMediumInteger, [], {}, "MEDIUMINT"),
        (mysql.MSMediumInteger, [4], {}, "MEDIUMINT(4)"),
        (
            mysql.MSMediumInteger,
            [4],
            {
                "unsigned": True
            },
            "MEDIUMINT(4) UNSIGNED",
        ),
        (
            mysql.MSMediumInteger,
            [4],
            {
                "zerofill": True
            },
            "MEDIUMINT(4) ZEROFILL",
        ),
        (
            mysql.MSMediumInteger,
            [4],
            {
                "zerofill": True,
                "unsigned": True
            },
            "MEDIUMINT(4) UNSIGNED ZEROFILL",
        ),
        (mysql.MSTinyInteger, [], {}, "TINYINT"),
        (mysql.MSTinyInteger, [1], {}, "TINYINT(1)"),
        (mysql.MSTinyInteger, [1], {
            "unsigned": True
        }, "TINYINT(1) UNSIGNED"),
        (mysql.MSTinyInteger, [1], {
            "zerofill": True
        }, "TINYINT(1) ZEROFILL"),
        (
            mysql.MSTinyInteger,
            [1],
            {
                "zerofill": True,
                "unsigned": True
            },
            "TINYINT(1) UNSIGNED ZEROFILL",
        ),
        (mysql.MSSmallInteger, [], {}, "SMALLINT"),
        (mysql.MSSmallInteger, [4], {}, "SMALLINT(4)"),
        (
            mysql.MSSmallInteger,
            [4],
            {
                "unsigned": True
            },
            "SMALLINT(4) UNSIGNED",
        ),
        (
            mysql.MSSmallInteger,
            [4],
            {
                "zerofill": True
            },
            "SMALLINT(4) ZEROFILL",
        ),
        (
            mysql.MSSmallInteger,
            [4],
            {
                "zerofill": True,
                "unsigned": True
            },
            "SMALLINT(4) UNSIGNED ZEROFILL",
        ),
    )
    def test_numeric(self, type_, args, kw, res):
        "Exercise type specification and options for numeric types."

        type_inst = type_(*args, **kw)
        self.assert_compile(type_inst, res)
        # test that repr() copies out all arguments
        self.assert_compile(eval("mysql.%r" % type_inst), res)

    @testing.combinations(
        (mysql.MSChar, [1], {}, "CHAR(1)"),
        (mysql.NCHAR, [1], {}, "NATIONAL CHAR(1)"),
        (mysql.MSChar, [1], {
            "binary": True
        }, "CHAR(1) BINARY"),
        (mysql.MSChar, [1], {
            "ascii": True
        }, "CHAR(1) ASCII"),
        (mysql.MSChar, [1], {
            "unicode": True
        }, "CHAR(1) UNICODE"),
        (
            mysql.MSChar,
            [1],
            {
                "ascii": True,
                "binary": True
            },
            "CHAR(1) ASCII BINARY",
        ),
        (
            mysql.MSChar,
            [1],
            {
                "unicode": True,
                "binary": True
            },
            "CHAR(1) UNICODE BINARY",
        ),
        (mysql.MSChar, [1], {
            "charset": "utf8"
        }, "CHAR(1) CHARACTER SET utf8"),
        (
            mysql.MSChar,
            [1],
            {
                "charset": "utf8",
                "binary": True
            },
            "CHAR(1) CHARACTER SET utf8 BINARY",
        ),
        (
            mysql.MSChar,
            [1],
            {
                "charset": "utf8",
                "unicode": True
            },
            "CHAR(1) CHARACTER SET utf8",
        ),
        (
            mysql.MSChar,
            [1],
            {
                "charset": "utf8",
                "ascii": True
            },
            "CHAR(1) CHARACTER SET utf8",
        ),
        (
            mysql.MSChar,
            [1],
            {
                "collation": "utf8_bin"
            },
            "CHAR(1) COLLATE utf8_bin",
        ),
        (
            mysql.MSChar,
            [1],
            {
                "charset": "utf8",
                "collation": "utf8_bin"
            },
            "CHAR(1) CHARACTER SET utf8 COLLATE utf8_bin",
        ),
        (
            mysql.MSChar,
            [1],
            {
                "charset": "utf8",
                "binary": True
            },
            "CHAR(1) CHARACTER SET utf8 BINARY",
        ),
        (
            mysql.MSChar,
            [1],
            {
                "charset": "utf8",
                "collation": "utf8_bin",
                "binary": True
            },
            "CHAR(1) CHARACTER SET utf8 COLLATE utf8_bin",
        ),
        (mysql.MSChar, [1], {
            "national": True
        }, "NATIONAL CHAR(1)"),
        (
            mysql.MSChar,
            [1],
            {
                "national": True,
                "charset": "utf8"
            },
            "NATIONAL CHAR(1)",
        ),
        (
            mysql.MSChar,
            [1],
            {
                "national": True,
                "charset": "utf8",
                "binary": True
            },
            "NATIONAL CHAR(1) BINARY",
        ),
        (
            mysql.MSChar,
            [1],
            {
                "national": True,
                "binary": True,
                "unicode": True
            },
            "NATIONAL CHAR(1) BINARY",
        ),
        (
            mysql.MSChar,
            [1],
            {
                "national": True,
                "collation": "utf8_bin"
            },
            "NATIONAL CHAR(1) COLLATE utf8_bin",
        ),
        (
            mysql.MSString,
            [1],
            {
                "charset": "utf8",
                "collation": "utf8_bin"
            },
            "VARCHAR(1) CHARACTER SET utf8 COLLATE utf8_bin",
        ),
        (
            mysql.MSString,
            [1],
            {
                "national": True,
                "collation": "utf8_bin"
            },
            "NATIONAL VARCHAR(1) COLLATE utf8_bin",
        ),
        (
            mysql.MSTinyText,
            [],
            {
                "charset": "utf8",
                "collation": "utf8_bin"
            },
            "TINYTEXT CHARACTER SET utf8 COLLATE utf8_bin",
        ),
        (
            mysql.MSMediumText,
            [],
            {
                "charset": "utf8",
                "binary": True
            },
            "MEDIUMTEXT CHARACTER SET utf8 BINARY",
        ),
        (mysql.MSLongText, [], {
            "ascii": True
        }, "LONGTEXT ASCII"),
        (
            mysql.ENUM,
            ["foo", "bar"],
            {
                "unicode": True
            },
            """ENUM('foo','bar') UNICODE""",
        ),
        (String, [20], {
            "collation": "utf8"
        }, "VARCHAR(20) COLLATE utf8"),
    )
    @testing.exclude("mysql", "<", (4, 1, 1), "no charset support")
    def test_charset(self, type_, args, kw, res):
        """Exercise CHARACTER SET and COLLATE-ish options on string types."""

        type_inst = type_(*args, **kw)
        self.assert_compile(type_inst, res)

    @testing.combinations(
        (mysql.MSBit(), "BIT"),
        (mysql.MSBit(1), "BIT(1)"),
        (mysql.MSBit(63), "BIT(63)"),
    )
    def test_bit_50(self, type_, expected):
        """Exercise BIT types on 5.0+ (not valid for all engine types)"""

        self.assert_compile(type_, expected)

    @testing.combinations(
        (BOOLEAN(), "BOOL"),
        (Boolean(), "BOOL"),
        (mysql.TINYINT(1), "TINYINT(1)"),
        (mysql.TINYINT(1, unsigned=True), "TINYINT(1) UNSIGNED"),
    )
    def test_boolean_compile(self, type_, expected):
        self.assert_compile(type_, expected)

    def test_timestamp_fsp(self):
        self.assert_compile(mysql.TIMESTAMP(fsp=5), "TIMESTAMP(5)")

    @testing.combinations(
        ([TIMESTAMP], {}, "TIMESTAMP NULL"),
        ([mysql.MSTimeStamp], {}, "TIMESTAMP NULL"),
        (
            [
                mysql.MSTimeStamp(),
                DefaultClause(sql.text("CURRENT_TIMESTAMP")),
            ],
            {},
            "TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP",
        ),
        (
            [mysql.MSTimeStamp,
             DefaultClause(sql.text("CURRENT_TIMESTAMP"))],
            {
                "nullable": False
            },
            "TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP",
        ),
        (
            [
                mysql.MSTimeStamp,
                DefaultClause(sql.text("'1999-09-09 09:09:09'")),
            ],
            {
                "nullable": False
            },
            "TIMESTAMP NOT NULL DEFAULT '1999-09-09 09:09:09'",
        ),
        (
            [
                mysql.MSTimeStamp(),
                DefaultClause(sql.text("'1999-09-09 09:09:09'")),
            ],
            {},
            "TIMESTAMP NULL DEFAULT '1999-09-09 09:09:09'",
        ),
        (
            [
                mysql.MSTimeStamp(),
                DefaultClause(
                    sql.text("'1999-09-09 09:09:09' "
                             "ON UPDATE CURRENT_TIMESTAMP")),
            ],
            {},
            "TIMESTAMP NULL DEFAULT '1999-09-09 09:09:09' "
            "ON UPDATE CURRENT_TIMESTAMP",
        ),
        (
            [
                mysql.MSTimeStamp,
                DefaultClause(
                    sql.text("'1999-09-09 09:09:09' "
                             "ON UPDATE CURRENT_TIMESTAMP")),
            ],
            {
                "nullable": False
            },
            "TIMESTAMP NOT NULL DEFAULT '1999-09-09 09:09:09' "
            "ON UPDATE CURRENT_TIMESTAMP",
        ),
        (
            [
                mysql.MSTimeStamp(),
                DefaultClause(
                    sql.text("CURRENT_TIMESTAMP "
                             "ON UPDATE CURRENT_TIMESTAMP")),
            ],
            {},
            "TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP "
            "ON UPDATE CURRENT_TIMESTAMP",
        ),
        (
            [
                mysql.MSTimeStamp,
                DefaultClause(
                    sql.text("CURRENT_TIMESTAMP "
                             "ON UPDATE CURRENT_TIMESTAMP")),
            ],
            {
                "nullable": False
            },
            "TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP "
            "ON UPDATE CURRENT_TIMESTAMP",
        ),
    )
    def test_timestamp_defaults(self, spec, kw, expected):
        """Exercise funky TIMESTAMP default syntax when used in columns."""

        c = Column("t", *spec, **kw)
        Table("t", MetaData(), c)
        self.assert_compile(schema.CreateColumn(c), "t %s" % expected)

    def test_datetime_generic(self):
        self.assert_compile(mysql.DATETIME(), "DATETIME")

    def test_datetime_fsp(self):
        self.assert_compile(mysql.DATETIME(fsp=4), "DATETIME(4)")

    def test_time_generic(self):
        """"Exercise TIME."""

        self.assert_compile(mysql.TIME(), "TIME")

    def test_time_fsp(self):
        self.assert_compile(mysql.TIME(fsp=5), "TIME(5)")

    def test_time_result_processor(self):
        eq_(
            mysql.TIME().result_processor(None, None)(datetime.timedelta(
                seconds=35, minutes=517, microseconds=450)),
            datetime.time(8, 37, 35, 450),
        )