def upgrade(): # Save form op.add_column('etablissements_admin_update', sa.Column('certified_recruiter', mysql.BOOLEAN(), default=False)) op.add_column('etablissements_admin_update', sa.Column('recruiter_uid', mysql.TINYTEXT(), default='')) # Recruiter messages op.add_column('other_recruiter_message', sa.Column('certified_recruiter', mysql.BOOLEAN(), default=False)) op.add_column('other_recruiter_message', sa.Column('recruiter_uid', mysql.TINYTEXT(), default='')) op.add_column('remove_recruiter_message', sa.Column('certified_recruiter', mysql.BOOLEAN(), default=False)) op.add_column('remove_recruiter_message', sa.Column('recruiter_uid', mysql.TINYTEXT(), default='')) op.add_column('update_coordinates_recruiter_message', sa.Column('certified_recruiter', mysql.BOOLEAN(), default=False)) op.add_column('update_coordinates_recruiter_message', sa.Column('recruiter_uid', mysql.TINYTEXT(), default='')) op.add_column('update_jobs_recruiter_message', sa.Column('certified_recruiter', mysql.BOOLEAN(), default=False)) op.add_column('update_jobs_recruiter_message', sa.Column('recruiter_uid', mysql.TINYTEXT(), default=''))
def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.create_table( 'networking_acquaintances', sa.Column('network_id', sa.Integer(), autoincrement=True, nullable=False), sa.Column('acquaintance_name_and_title', mysql.TINYTEXT(), nullable=True), sa.Column('company_name', mysql.TINYTEXT(), nullable=True), sa.Column('contact_information', mysql.TINYTEXT(), nullable=True), sa.Column('comments', mysql.TEXT(), nullable=True), sa.Column('created_at', mysql.DATETIME(), nullable=True), sa.Column('updated_at', mysql.DATETIME(), nullable=True), sa.PrimaryKeyConstraint('network_id'))
def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.alter_column('contest', 'judge_result_visible', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('contest', 'ranklist_visible', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('contest', 'rated', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('discussions', 'top', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.add_column( 'problems', sa.Column('remote_judge_oj', sa.String(length=10), nullable=True)) op.add_column( 'problems', sa.Column('remote_problem_id', sa.String(length=20), nullable=True)) op.alter_column('problems', 'can_see_results', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('problems', 'public', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=True) op.alter_column('problems', 'using_file_io', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=True) op.alter_column('submissions', 'public', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=True) op.alter_column('users', 'banned', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('users', 'permission_group', existing_type=mysql.TINYTEXT(collation='utf8mb4_bin'), type_=sa.Text(length=20), existing_nullable=False)
def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.alter_column('users', 'permission_group', existing_type=sa.Text(length=20), type_=mysql.TINYTEXT(), existing_nullable=False) op.alter_column('users', 'banned', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('submissions', 'public', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=True) op.alter_column('problems', 'using_file_io', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=True) op.alter_column('problems', 'public', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=True) op.alter_column('problems', 'can_see_results', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('problem_set', 'show_ranklist', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('problem_set', 'private', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('discussions', 'top', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'rated', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'ranklist_visible', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'private_contest', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'judge_result_visible', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'invite_code', existing_type=sa.String(length=20), type_=mysql.VARCHAR(length=10), existing_nullable=False)
def create_table(name, *columns): common_colums = [ sa.Column('id', mysql.INTEGER(display_width=11), nullable=False), sa.Column('siret', mysql.TINYTEXT(), nullable=True), sa.Column('requested_by_first_name', mysql.TINYTEXT()), sa.Column('requested_by_last_name', mysql.TINYTEXT(), nullable=True), sa.Column('requested_by_email', mysql.TINYTEXT(), nullable=True), sa.Column('requested_by_phone', mysql.TINYTEXT(), nullable=True), sa.Column('date_created', mysql.DATETIME(), nullable=True), sa.Column('date_updated', mysql.DATETIME(), nullable=True), ] args = [name] + common_colums + list(columns) + [ sa.PrimaryKeyConstraint('id') ] op.create_table(*args, mysql_collate='utf8mb4_unicode_ci', mysql_default_charset='utf8mb4', mysql_engine='InnoDB')
def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.alter_column('contest', 'judge_result_visible', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('contest', 'ranklist_visible', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('contest', 'rated', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('discussions', 'top', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('problems', 'can_see_results', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('problems', 'public', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=True) op.alter_column('problems', 'using_file_io', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=True) op.alter_column('submissions', 'public', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=True) op.add_column('users', sa.Column('force_logout_before', sa.Float(), nullable=False)) conn: Connection = op.get_bind() # 设置 conn.execute("""UPDATE users set force_logout_before = 0 where 1 = 1""") op.alter_column('users', 'banned', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('users', 'permission_group', existing_type=mysql.TINYTEXT(collation='utf8mb4_bin'), type_=sa.Text(length=20), existing_nullable=False)
def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.create_table('candidates', sa.Column('user_id', sa.Integer(), nullable=False), sa.Column('user_name', mysql.MEDIUMTEXT(), nullable=True), sa.Column('user_registration', sa.DateTime(), nullable=True), sa.Column('user_editcount', sa.Integer(), nullable=True), sa.Column('candidate_status', mysql.TINYTEXT(), nullable=True), sa.Column('invite_sent', mysql.TINYTEXT(), nullable=True), sa.Column('created_at', sa.DateTime(), nullable=True), sa.PrimaryKeyConstraint('user_id'), mysql_charset='utf8', mysql_collate='utf8_general_ci', mysql_engine='InnoDB') op.create_index(op.f('ix_candidates_created_at'), 'candidates', ['created_at'], unique=False) op.create_index(op.f('ix_candidates_user_registration'), 'candidates', ['user_registration'], unique=False) op.create_table( 'predictions', sa.Column('prediction_id', sa.Integer(), nullable=False), sa.Column('user_id', sa.Integer(), nullable=True), sa.Column('predicted_at', sa.DateTime(), nullable=True), sa.Column('user_summary', mysql.JSON(), nullable=True), sa.Column('scores', mysql.JSON(), nullable=True), sa.Column('pred_min', sa.Float(), nullable=True), sa.Column('newcomer_predictions', mysql.JSON(), nullable=True), sa.Column('pred_error', mysql.MEDIUMTEXT(), nullable=True), sa.PrimaryKeyConstraint('prediction_id')) op.create_index(op.f('ix_predictions_predicted_at'), 'predictions', ['predicted_at'], unique=False) op.create_index(op.f('ix_predictions_user_id'), 'predictions', ['user_id'], unique=False)
def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.alter_column('users', 'permission_group', existing_type=sa.Text(length=20), type_=mysql.TINYTEXT(collation='utf8mb4_bin'), existing_nullable=False) op.alter_column('users', 'banned', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('submissions', 'public', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=True) op.drop_constraint(None, 'remote_accounts', type_='unique') op.alter_column('problems', 'using_file_io', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=True) op.alter_column('problems', 'public', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=True) op.alter_column('problems', 'can_see_results', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('discussions', 'top', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'rated', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'ranklist_visible', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'judge_result_visible', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False)
def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.create_table( 'interviews', sa.Column('interview_id', sa.Integer(), autoincrement=True, nullable=False), sa.Column('interview_date', mysql.DATETIME(), nullable=True), sa.Column('interviewer_name_and_title', mysql.TINYTEXT(), nullable=True), sa.Column('phone', mysql.TINYTEXT(), nullable=True), sa.Column('email_and_other_contact', mysql.TINYTEXT(), nullable=True), sa.Column('interview_address', mysql.TINYTEXT(), nullable=True), sa.Column('mailing_address', mysql.TINYTEXT(), nullable=True), sa.Column('follow_up_date', mysql.DATETIME(), nullable=True), sa.Column('comments', mysql.TEXT(), nullable=True), sa.Column('created_at', mysql.DATETIME(), nullable=True), sa.Column('updated_at', mysql.DATETIME(), nullable=True), sa.PrimaryKeyConstraint('interview_id'))
def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.alter_column('contest', 'judge_result_visible', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('contest', 'ranklist_visible', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('contest', 'rated', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('discussions', 'top', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.add_column('permission_groups', sa.Column( 'inherit', sa.String(length=20), nullable=False)) op.alter_column('problems', 'can_see_results', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('problems', 'public', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=True) op.alter_column('problems', 'using_file_io', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=True) op.alter_column('submissions', 'public', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=True) op.alter_column('users', 'banned', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('users', 'permission_group', existing_type=mysql.TINYTEXT(collation='utf8mb4_bin'), type_=sa.Text(length=20), existing_nullable=False) # ### end Alembic commands ### from sqlalchemy.engine import Connection conn: Connection = op.get_bind() conn.execute( """update permission_groups set inherit = "" where 1=1""" )
def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.add_column('users', sa.Column('raw_admin', mysql.TINYINT(display_width=1), autoincrement=False, nullable=False)) op.add_column('users', sa.Column('is_admin', mysql.TINYINT(display_width=1), autoincrement=False, nullable=True)) op.alter_column('users', 'permission_group', existing_type=sa.Text(length=20), type_=mysql.TINYTEXT(), existing_nullable=False) op.alter_column('users', 'banned', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('submissions', 'public', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=True) op.alter_column('problems', 'using_file_io', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=True) op.alter_column('problems', 'public', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=True) op.alter_column('problems', 'can_see_results', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('discussions', 'top', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'rated', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'ranklist_visible', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'judge_result_visible', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False)
def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.create_table( 'users', sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(length=30), nullable=True), sa.Column('email', sa.String(length=30), nullable=True), sa.Column('role', sa.Enum('average', 'master', name='roleenum'), nullable=True), sa.Column('password_hash', sa.String(length=512), nullable=True), sa.PrimaryKeyConstraint('id')) op.create_table( 'advertisements', sa.Column('id', sa.Integer(), nullable=False), sa.Column('summary', sa.String(length=50), nullable=True), sa.Column('description', mysql.TINYTEXT(), nullable=True), sa.Column('topic', sa.String(length=15), nullable=True), sa.Column('modifier', sa.Enum('public', 'local', name='modifierenum'), nullable=True), sa.Column('user_id', sa.Integer(), nullable=True), sa.ForeignKeyConstraint( ['user_id'], ['users.id'], ), sa.PrimaryKeyConstraint('id'))
class TestEndToEnd(object): timeout_seconds = 60 @pytest.fixture def table_name(self, replhandler): return '{0}_biz'.format(replhandler) @pytest.fixture def avro_schema(self, table_name): return { u'fields': [{ u'type': u'int', u'name': u'id', u'pkey': 1 }, { u'default': None, u'maxlen': 64, u'type': [u'null', u'string'], u'name': u'name' }], u'namespace': u'', u'name': table_name, u'type': u'record', u'pkey': [u'id'] } @pytest.fixture(params=[{ 'table_name': 'test_complex_table', 'test_schema': [ # test_bit # ColumnInfo('BIT(8)', mysql.BIT, 3), # test_tinyint ColumnInfo('TINYINT', mysql.TINYINT(), 127), ColumnInfo('TINYINT(3) SIGNED', mysql.TINYINT(display_width=3, unsigned=False), -128), ColumnInfo('TINYINT(3) UNSIGNED', mysql.TINYINT(display_width=3, unsigned=True), 255), ColumnInfo( 'TINYINT(3) UNSIGNED ZEROFILL', mysql.TINYINT(display_width=3, unsigned=True, zerofill=True), 5), ColumnInfo('BOOL', mysql.BOOLEAN(), 1), ColumnInfo('BOOLEAN', mysql.BOOLEAN(), 1), # test_smallint ColumnInfo('SMALLINT', mysql.SMALLINT(), 32767), ColumnInfo('SMALLINT(5) SIGNED', mysql.SMALLINT(display_width=5, unsigned=False), -32768), ColumnInfo('SMALLINT(5) UNSIGNED', mysql.SMALLINT(display_width=5, unsigned=True), 65535), ColumnInfo( 'SMALLINT(3) UNSIGNED ZEROFILL', mysql.SMALLINT(display_width=3, unsigned=True, zerofill=True), 5), # test_mediumint ColumnInfo('MEDIUMINT', mysql.MEDIUMINT(), 8388607), ColumnInfo('MEDIUMINT(7) SIGNED', mysql.MEDIUMINT(display_width=7, unsigned=False), -8388608), ColumnInfo('MEDIUMINT(8) UNSIGNED', mysql.MEDIUMINT(display_width=8, unsigned=True), 16777215), ColumnInfo( 'MEDIUMINT(3) UNSIGNED ZEROFILL', mysql.MEDIUMINT(display_width=3, unsigned=True, zerofill=True), 5), # test_int ColumnInfo('INT', mysql.INTEGER(), 2147483647), ColumnInfo('INT(10) SIGNED', mysql.INTEGER(display_width=10, unsigned=False), -2147483648), ColumnInfo('INT(11) UNSIGNED', mysql.INTEGER(display_width=11, unsigned=True), 4294967295), ColumnInfo( 'INT(3) UNSIGNED ZEROFILL', mysql.INTEGER(display_width=3, unsigned=True, zerofill=True), 5), ColumnInfo('INTEGER(3)', mysql.INTEGER(display_width=3), 3), # test_bigint ColumnInfo('BIGINT(19)', mysql.BIGINT(display_width=19), 23372854775807), ColumnInfo('BIGINT(19) SIGNED', mysql.BIGINT(display_width=19, unsigned=False), -9223372036854775808), # ColumnInfo('BIGINT(20) UNSIGNED', mysql.INTEGER(display_width=20, unsigned=True), 18446744073709551615), ColumnInfo( 'BIGINT(3) UNSIGNED ZEROFILL', mysql.BIGINT(display_width=3, unsigned=True, zerofill=True), 5), # test_decimal ColumnInfo('DECIMAL(9, 2)', mysql.DECIMAL(precision=9, scale=2), 101.41), ColumnInfo('DECIMAL(12, 11) SIGNED', mysql.DECIMAL(precision=12, scale=11, unsigned=False), -3.14159265359), ColumnInfo('DECIMAL(2, 1) UNSIGNED', mysql.DECIMAL(precision=2, scale=1, unsigned=True), 0.0), ColumnInfo( 'DECIMAL(9, 2) UNSIGNED ZEROFILL', mysql.DECIMAL(precision=9, scale=2, unsigned=True, zerofill=True), 5.22), ColumnInfo('DEC(9, 3)', mysql.DECIMAL(precision=9, scale=3), 5.432), ColumnInfo('FIXED(9, 3)', mysql.DECIMAL(precision=9, scale=3), 45.432), # test_float ColumnInfo('FLOAT', mysql.FLOAT(), 3.14), ColumnInfo('FLOAT(5, 3) SIGNED', mysql.FLOAT(precision=5, scale=3, unsigned=False), -2.14), ColumnInfo('FLOAT(5, 3) UNSIGNED', mysql.FLOAT(precision=5, scale=3, unsigned=True), 2.14), ColumnInfo( 'FLOAT(5, 3) UNSIGNED ZEROFILL', mysql.FLOAT(precision=5, scale=3, unsigned=True, zerofill=True), 24.00), ColumnInfo('FLOAT(5)', mysql.FLOAT(5), 24.01), ColumnInfo('FLOAT(30)', mysql.FLOAT(30), 24.01), # test_double ColumnInfo('DOUBLE', mysql.DOUBLE(), 3.14), ColumnInfo('DOUBLE(5, 3) SIGNED', mysql.DOUBLE(precision=5, scale=3, unsigned=False), -3.14), ColumnInfo('DOUBLE(5, 3) UNSIGNED', mysql.DOUBLE(precision=5, scale=3, unsigned=True), 2.14), ColumnInfo( 'DOUBLE(5, 3) UNSIGNED ZEROFILL', mysql.DOUBLE(precision=5, scale=3, unsigned=True, zerofill=True), 24.00), ColumnInfo('DOUBLE PRECISION', mysql.DOUBLE(), 3.14), ColumnInfo('REAL', mysql.DOUBLE(), 3.14), # test_date_time ColumnInfo('DATE', mysql.DATE(), datetime.date(1901, 1, 1)), ColumnInfo('DATE', mysql.DATE(), datetime.date(2050, 12, 31)), ColumnInfo('DATETIME', mysql.DATETIME(), datetime.datetime(1970, 1, 1, 0, 0, 1, 0)), ColumnInfo('DATETIME', mysql.DATETIME(), datetime.datetime(2038, 1, 19, 3, 14, 7, 0)), ColumnInfo('DATETIME(6)', mysql.DATETIME(fsp=6), datetime.datetime(1970, 1, 1, 0, 0, 1, 111111)), ColumnInfo('DATETIME(6)', mysql.DATETIME(fsp=6), datetime.datetime(2038, 1, 19, 3, 14, 7, 999999)), ColumnInfo('TIMESTAMP', mysql.TIMESTAMP(), datetime.datetime(1970, 1, 1, 0, 0, 1, 0)), ColumnInfo('TIMESTAMP', mysql.TIMESTAMP(), datetime.datetime(2038, 1, 19, 3, 14, 7, 0)), ColumnInfo('TIMESTAMP(6)', mysql.TIMESTAMP(fsp=6), datetime.datetime(1970, 1, 1, 0, 0, 1, 111111)), ColumnInfo('TIMESTAMP(6)', mysql.TIMESTAMP(fsp=6), datetime.datetime(2038, 1, 19, 3, 14, 7, 999999)), ColumnInfo('TIME', mysql.TIME(), datetime.timedelta(0, 0, 0)), ColumnInfo('TIME', mysql.TIME(), datetime.timedelta(0, 23 * 3600 + 59 * 60 + 59, 0)), ColumnInfo('TIME(6)', mysql.TIME(fsp=6), datetime.timedelta(0, 0, 111111)), ColumnInfo('TIME(6)', mysql.TIME(fsp=6), datetime.timedelta(0, 23 * 3600 + 59 * 60 + 59, 999999)), ColumnInfo('YEAR', mysql.YEAR(), 2000), ColumnInfo('YEAR(4)', mysql.YEAR(display_width=4), 2000), # test_char ColumnInfo('CHAR', mysql.CHAR(), 'a'), ColumnInfo('CHARACTER', mysql.CHAR(), 'a'), ColumnInfo('NATIONAL CHAR', mysql.CHAR(), 'a'), ColumnInfo('NCHAR', mysql.CHAR(), 'a'), ColumnInfo('CHAR(0)', mysql.CHAR(length=0), ''), ColumnInfo('CHAR(10)', mysql.CHAR(length=10), '1234567890'), ColumnInfo('VARCHAR(1000)', mysql.VARCHAR(length=1000), 'asdasdd'), ColumnInfo('CHARACTER VARYING(1000)', mysql.VARCHAR(length=1000), 'test dsafnskdf j'), ColumnInfo('NATIONAL VARCHAR(1000)', mysql.VARCHAR(length=1000), 'asdkjasd'), ColumnInfo('NVARCHAR(1000)', mysql.VARCHAR(length=1000), 'asdkjasd'), ColumnInfo('VARCHAR(10000)', mysql.VARCHAR(length=10000), '1234567890'), # test_binary ColumnInfo('BINARY(5)', mysql.BINARY(length=5), 'hello'), ColumnInfo('VARBINARY(100)', mysql.VARBINARY(length=100), 'hello'), ColumnInfo('TINYBLOB', mysql.TINYBLOB(), 'hello'), ColumnInfo('TINYTEXT', mysql.TINYTEXT(), 'hello'), ColumnInfo('BLOB', mysql.BLOB(), 'hello'), ColumnInfo('BLOB(100)', mysql.BLOB(length=100), 'hello'), ColumnInfo('TEXT', mysql.TEXT(), 'hello'), ColumnInfo('TEXT(100)', mysql.TEXT(length=100), 'hello'), ColumnInfo('MEDIUMBLOB', mysql.MEDIUMBLOB(), 'hello'), ColumnInfo('MEDIUMTEXT', mysql.MEDIUMTEXT(), 'hello'), ColumnInfo('LONGBLOB', mysql.LONGBLOB(), 'hello'), ColumnInfo('LONGTEXT', mysql.LONGTEXT(), 'hello'), # test_enum ColumnInfo("ENUM('ONE', 'TWO')", mysql.ENUM(['ONE', 'TWO']), 'ONE'), # test_set ColumnInfo("SET('ONE', 'TWO')", mysql.SET(['ONE', 'TWO']), set(['ONE', 'TWO'])) ] }]) def complex_table(self, request): return request.param @pytest.fixture def complex_table_name(self, replhandler, complex_table): return "{0}_{1}".format(replhandler, complex_table['table_name']) @pytest.fixture def complex_table_schema(self, complex_table): return complex_table['test_schema'] def _build_sql_column_name(self, complex_column_name): return 'test_{}'.format(complex_column_name) def _build_complex_column_create_query(self, complex_column_name, complex_column_schema): return '`{0}` {1}'.format(complex_column_name, complex_column_schema) @pytest.fixture def complex_table_create_query(self, complex_table_schema): return ", ".join([ self._build_complex_column_create_query( self._build_sql_column_name(indx), complex_column_schema.type) for indx, complex_column_schema in enumerate(complex_table_schema) ]) @pytest.fixture def sqla_objs(self, complex_table_schema): return [ complex_column_schema.sqla_obj for complex_column_schema in complex_table_schema ] @pytest.fixture def create_complex_table(self, containers, rbrsource, complex_table_name, complex_table_create_query): if complex_table_create_query.strip(): complex_table_create_query = ", {}".format( complex_table_create_query) query = """CREATE TABLE {complex_table_name} ( `id` int(11) NOT NULL PRIMARY KEY {complex_table_create_query} ) ENGINE=InnoDB DEFAULT CHARSET=utf8 """.format(complex_table_name=complex_table_name, complex_table_create_query=complex_table_create_query) execute_query_get_one_row(containers, rbrsource, query) @pytest.fixture def ComplexModel(self, complex_table_name, create_complex_table, complex_table_schema): class Model(Base): __tablename__ = complex_table_name id = Column('id', Integer, primary_key=True) for indx, complex_column_schema in enumerate(complex_table_schema): col_name = self._build_sql_column_name(indx) setattr(Model, col_name, Column(col_name, complex_column_schema.sqla_obj)) return Model @pytest.fixture def actual_complex_data(self, complex_table_schema): res = {'id': 1} for indx, complex_column_schema in enumerate(complex_table_schema): if isinstance(complex_column_schema.sqla_obj, mysql.DATE): data = complex_column_schema.data.strftime('%Y-%m-%d') elif isinstance(complex_column_schema.sqla_obj, mysql.DATETIME): data = complex_column_schema.data.strftime( '%Y-%m-%d %H:%M:%S.%f') elif isinstance(complex_column_schema.sqla_obj, mysql.TIMESTAMP): data = complex_column_schema.data.strftime( '%Y-%m-%d %H:%M:%S.%f') elif isinstance(complex_column_schema.sqla_obj, mysql.TIME): time = datetime.time( complex_column_schema.data.seconds / 3600, (complex_column_schema.data.seconds / 60) % 60, complex_column_schema.data.seconds % 60, complex_column_schema.data.microseconds) data = time.strftime('%H:%M:%S.%f') else: data = complex_column_schema.data res.update({self._build_sql_column_name(indx): data}) return res @pytest.fixture def expected_complex_data(self, actual_complex_data, complex_table_schema): expected_complex_data_dict = {'id': 1} for indx, complex_column_schema in enumerate(complex_table_schema): column_name = self._build_sql_column_name(indx) if isinstance(complex_column_schema.sqla_obj, mysql.SET): expected_complex_data_dict[column_name] = \ sorted(actual_complex_data[column_name]) elif isinstance(complex_column_schema.sqla_obj, mysql.DATETIME): date_time_obj = \ complex_column_schema.data.isoformat() expected_complex_data_dict[column_name] = date_time_obj elif isinstance(complex_column_schema.sqla_obj, mysql.TIMESTAMP): date_time_obj = \ complex_column_schema.data.replace(tzinfo=pytz.utc) expected_complex_data_dict[column_name] = date_time_obj elif isinstance(complex_column_schema.sqla_obj, mysql.TIME): number_of_micros = transform_timedelta_to_number_of_microseconds( complex_column_schema.data) expected_complex_data_dict[column_name] = number_of_micros else: expected_complex_data_dict[column_name] = \ complex_column_schema.data return expected_complex_data_dict def test_complex_table(self, containers, rbrsource, complex_table_name, ComplexModel, actual_complex_data, expected_complex_data, schematizer, namespace, rbr_source_session, gtid_enabled): if not gtid_enabled: increment_heartbeat(containers, rbrsource) complex_instance = ComplexModel(**actual_complex_data) rbr_source_session.add(complex_instance) rbr_source_session.commit() messages = _fetch_messages(containers, schematizer, namespace, complex_table_name, 1) expected_messages = [ { 'message_type': MessageType.create, 'payload_data': expected_complex_data }, ] _verify_messages(messages, expected_messages) def test_create_table(self, containers, rbrsource, schematracker, create_table_query, avro_schema, table_name, namespace, schematizer, rbr_source_session, gtid_enabled): if not gtid_enabled: increment_heartbeat(containers, rbrsource) execute_query_get_one_row( containers, rbrsource, create_table_query.format(table_name=table_name)) # Need to poll for the creation of the table _wait_for_table(containers, schematracker, table_name) # Check the schematracker db also has the table. verify_create_table_query = "SHOW CREATE TABLE {table_name}".format( table_name=table_name) verify_create_table_result = execute_query_get_one_row( containers, schematracker, verify_create_table_query) expected_create_table_result = execute_query_get_one_row( containers, rbrsource, verify_create_table_query) self.assert_expected_result(verify_create_table_result, expected_create_table_result) # It's necessary to insert data for the topic to actually be created. Biz = _generate_basic_model(table_name) rbr_source_session.add(Biz(id=1, name='insert')) rbr_source_session.commit() _wait_for_schematizer_topic(schematizer, namespace, table_name) # Check schematizer. self.check_schematizer_has_correct_source_info(table_name=table_name, avro_schema=avro_schema, namespace=namespace, schematizer=schematizer) def test_create_table_with_row_format(self, containers, rbrsource, schematracker, replhandler, gtid_enabled): table_name = '{0}_row_format_tester'.format(replhandler) create_table_stmt = """ CREATE TABLE {name} ( id int(11) primary key) ROW_FORMAT=COMPRESSED ENGINE=InnoDB """.format(name=table_name) if not gtid_enabled: increment_heartbeat(containers, rbrsource) execute_query_get_one_row(containers, rbrsource, create_table_stmt) _wait_for_table(containers, schematracker, table_name) # Check the schematracker db also has the table. verify_create_table_query = "SHOW CREATE TABLE {table_name}".format( table_name=table_name) verify_create_table_result = execute_query_get_one_row( containers, schematracker, verify_create_table_query) expected_create_table_result = execute_query_get_one_row( containers, rbrsource, verify_create_table_query) self.assert_expected_result(verify_create_table_result, expected_create_table_result) def test_alter_table(self, containers, rbrsource, schematracker, alter_table_query, table_name, gtid_enabled): if not gtid_enabled: increment_heartbeat(containers, rbrsource) execute_query_get_one_row( containers, rbrsource, alter_table_query.format(table_name=table_name)) execute_query_get_one_row( containers, rbrsource, "ALTER TABLE {name} ROW_FORMAT=COMPRESSED".format(name=table_name)) time.sleep(2) # Check the schematracker db also has the table. verify_describe_table_query = "DESCRIBE {table_name}".format( table_name=table_name) verify_alter_table_result = execute_query_get_all_rows( containers, schematracker, verify_describe_table_query) expected_alter_table_result = execute_query_get_all_rows( containers, rbrsource, verify_describe_table_query) if 'address' in verify_alter_table_result[0].values(): actual_result = verify_alter_table_result[0] elif 'address' in verify_alter_table_result[1].values(): actual_result = verify_alter_table_result[1] else: raise AssertionError('The alter table query did not succeed') if 'address' in expected_alter_table_result[0].values(): expected_result = expected_alter_table_result[0] else: expected_result = expected_alter_table_result[1] self.assert_expected_result(actual_result, expected_result) def test_basic_table(self, containers, replhandler, rbrsource, create_table_query, namespace, schematizer, rbr_source_session, gtid_enabled): if not gtid_enabled: increment_heartbeat(containers, rbrsource) source = "{0}_basic_table".format(replhandler) execute_query_get_one_row(containers, rbrsource, create_table_query.format(table_name=source)) BasicModel = _generate_basic_model(source) model_1 = BasicModel(id=1, name='insert') model_2 = BasicModel(id=2, name='insert') rbr_source_session.add(model_1) rbr_source_session.add(model_2) rbr_source_session.commit() model_1.name = 'update' rbr_source_session.delete(model_2) rbr_source_session.commit() messages = _fetch_messages(containers, schematizer, namespace, source, 4) expected_messages = [ { 'message_type': MessageType.create, 'payload_data': { 'id': 1, 'name': 'insert' } }, { 'message_type': MessageType.create, 'payload_data': { 'id': 2, 'name': 'insert' } }, { 'message_type': MessageType.update, 'payload_data': { 'id': 1, 'name': 'update' }, 'previous_payload_data': { 'id': 1, 'name': 'insert' } }, { 'message_type': MessageType.delete, 'payload_data': { 'id': 2, 'name': 'insert' } }, ] _verify_messages(messages, expected_messages) def test_table_with_contains_pii(self, containers, replhandler, rbrsource, create_table_query, namespace, schematizer, rbr_source_session, gtid_enabled): with reconfigure(encryption_type='AES_MODE_CBC-1', key_location='acceptance/configs/data_pipeline/'): if not gtid_enabled: increment_heartbeat(containers, rbrsource) source = "{}_secret_table".format(replhandler) execute_query_get_one_row( containers, rbrsource, create_table_query.format(table_name=source)) BasicModel = _generate_basic_model(source) model_1 = BasicModel(id=1, name='insert') model_2 = BasicModel(id=2, name='insert') rbr_source_session.add(model_1) rbr_source_session.add(model_2) rbr_source_session.commit() messages = _fetch_messages(containers, schematizer, namespace, source, 2) expected_messages = [{ 'message_type': MessageType.create, 'payload_data': { 'id': 1, 'name': 'insert' } }, { 'message_type': MessageType.create, 'payload_data': { 'id': 2, 'name': 'insert' } }] _verify_messages(messages, expected_messages) def check_schematizer_has_correct_source_info(self, table_name, avro_schema, namespace, schematizer): sources = schematizer.get_sources_by_namespace(namespace) source = next(src for src in reversed(sources) if src.name == table_name) topic = schematizer.get_topics_by_source_id(source.source_id)[-1] schema = schematizer.get_latest_schema_by_topic_name(topic.name) assert schema.topic.source.name == table_name assert schema.topic.source.namespace.name == namespace assert schema.schema_json == avro_schema def assert_expected_result(self, result, expected): for key, value in expected.iteritems(): assert result[key] == value
def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.alter_column('users', 'permission_group', existing_type=sa.Text(length=20), type_=mysql.TINYTEXT(collation='utf8mb4_bin'), existing_nullable=False) op.alter_column('users', 'banned', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.drop_index(op.f('ix_submissions_problemset_id'), table_name='submissions') op.alter_column('submissions', 'public', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=True) op.alter_column('problems', 'using_file_io', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=True) op.alter_column('problems', 'public', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=True) op.alter_column('problems', 'can_see_results', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('problem_set', 'show_ranklist', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('problem_set', 'private', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('discussions', 'top', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'rated', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'ranklist_visible', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False) op.alter_column('contest', 'judge_result_visible', existing_type=sa.Boolean(), type_=mysql.TINYINT(display_width=1), existing_nullable=False)
def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.create_table('fill', sa.Column('id', sa.Integer(), nullable=False), sa.Column('date', sa.Date(), nullable=True), sa.Column('type', mysql.TINYINT(), nullable=True), sa.Column('detail', sa.JSON(), nullable=True), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_fill_date'), 'fill', ['date'], unique=False) op.create_table('human_country', sa.Column('fill_id', sa.Integer(), nullable=False), sa.Column('human_id', sa.Integer(), nullable=False), sa.Column('country', sa.Integer(), nullable=False), sa.PrimaryKeyConstraint('fill_id', 'human_id', 'country') ) op.create_table('metric', sa.Column('fill_id', sa.Integer(), nullable=False), sa.Column('population_id', mysql.TINYINT(), nullable=False), sa.Column('properties_id', sa.Integer(), nullable=False), sa.Column('aggregations_id', sa.Integer(), nullable=False), sa.Column('bias_value', sa.Integer(), nullable=True), sa.Column('total', sa.Integer(), nullable=True), sa.PrimaryKeyConstraint('fill_id', 'population_id', 'properties_id', 'aggregations_id'), mysql_partition_by='KEY(fill_id)' ) op.create_table('metric_aggregations_j', sa.Column('id', sa.Integer(), nullable=False), sa.Column('bias_value', sa.Integer(), nullable=True), sa.Column('aggregations', sa.JSON(), nullable=True), sa.Column('aggregations_len', mysql.TINYINT(), nullable=True), sa.PrimaryKeyConstraint('id') ) op.create_table('metric_aggregations_n', sa.Column('id', sa.Integer(), nullable=False), sa.Column('property', sa.Integer(), nullable=False), sa.Column('value', sa.Integer(), nullable=False), sa.Column('aggregation_order', sa.Integer(), nullable=False), sa.PrimaryKeyConstraint('id', 'property', 'value', 'aggregation_order') ) op.create_table('metric_properties_j', sa.Column('id', sa.Integer(), nullable=False), sa.Column('bias_property', sa.Integer(), nullable=True), sa.Column('properties', sa.JSON(), nullable=True), sa.Column('properties_len', mysql.TINYINT(), nullable=True), sa.PrimaryKeyConstraint('id') ) op.create_table('metric_properties_n', sa.Column('id', sa.Integer(), nullable=False), sa.Column('property', sa.Integer(), nullable=False), sa.Column('property_order', mysql.TINYINT(), nullable=False), sa.PrimaryKeyConstraint('id', 'property', 'property_order') ) op.create_table('project', sa.Column('id', sa.Integer(), nullable=False), sa.Column('code', mysql.VARCHAR(length=32), nullable=True), sa.Column('type', mysql.TINYTEXT(), nullable=True), sa.Column('label', mysql.TINYTEXT(), nullable=True), sa.Column('url', mysql.TINYTEXT(), nullable=True), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_project_code'), 'project', ['code'], unique=True) op.create_table('human', sa.Column('fill_id', sa.Integer(), nullable=False), sa.Column('qid', sa.Integer(), nullable=False), sa.Column('year_of_birth', sa.SMALLINT(), nullable=True), sa.Column('year_of_death', sa.SMALLINT(), nullable=True), sa.Column('gender', sa.Integer(), nullable=True), sa.Column('sitelink_count', sa.SMALLINT(), nullable=True), sa.ForeignKeyConstraint(['fill_id'], ['fill.id'], ), sa.PrimaryKeyConstraint('fill_id', 'qid') ) op.create_table('human_occupation', sa.Column('fill_id', sa.Integer(), nullable=False), sa.Column('human_id', sa.Integer(), nullable=False), sa.Column('occupation', sa.Integer(), nullable=False), sa.ForeignKeyConstraint(['fill_id'], ['fill.id'], ), sa.PrimaryKeyConstraint('fill_id', 'human_id', 'occupation') ) op.create_table('human_property', sa.Column('fill_id', sa.Integer(), nullable=False), sa.Column('human_id', sa.Integer(), nullable=False), sa.Column('property_p', sa.Integer(), nullable=False), sa.ForeignKeyConstraint(['fill_id'], ['fill.id'], ), sa.PrimaryKeyConstraint('fill_id', 'human_id', 'property_p') ) op.create_table('human_sitelink', sa.Column('fill_id', sa.Integer(), nullable=False), sa.Column('human_id', sa.Integer(), nullable=False), sa.Column('sitelink', mysql.VARCHAR(length=32), nullable=False), sa.ForeignKeyConstraint(['fill_id'], ['fill.id'], ), sa.PrimaryKeyConstraint('fill_id', 'human_id', 'sitelink') ) op.create_table('label', sa.Column('fill_id', sa.Integer(), nullable=True), sa.Column('qid', sa.Integer(), nullable=True), sa.Column('lang', mysql.VARCHAR(length=32), nullable=True), sa.Column('label', mysql.VARCHAR(length=512), nullable=True), sa.Column('property', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(['fill_id'], ['fill.id'], ), sa.PrimaryKeyConstraint('qid', 'lang') ) op.create_index(op.f('ix_label_property'), 'label', ['property'], unique=False) op.create_table('metric_coverage', sa.Column('fill_id', sa.Integer(), nullable=False), sa.Column('properties_id', sa.Integer(), nullable=False), sa.Column('total_with_properties', sa.Integer(), nullable=True), sa.Column('total_sitelinks_with_properties', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(['fill_id'], ['fill.id'], ), sa.PrimaryKeyConstraint('fill_id', 'properties_id') ) op.create_table('occupation_parent', sa.Column('fill_id', sa.Integer(), nullable=False), sa.Column('occupation', sa.Integer(), nullable=False), sa.Column('parent', sa.Integer(), nullable=False), sa.ForeignKeyConstraint(['fill_id'], ['fill.id'], ), sa.PrimaryKeyConstraint('fill_id', 'occupation', 'parent') )
def upgrade(): create_table( 'other_recruiter_message', sa.Column('comment', mysql.TEXT(collation='utf8mb4_unicode_ci'), nullable=True), ) create_table( 'remove_recruiter_message', sa.Column('remove_lba', mysql.BOOLEAN(), default=True), sa.Column('remove_lbb', mysql.BOOLEAN(), default=True), ) create_table( 'update_coordinates_recruiter_message', sa.Column('new_website', mysql.TINYTEXT(), nullable=True), sa.Column('new_email', mysql.TINYTEXT(), nullable=True), sa.Column('new_phone', mysql.TINYTEXT(), nullable=True), sa.Column('contact_mode', mysql.TINYTEXT(), nullable=True), sa.Column('new_email_alternance', mysql.TINYTEXT(), nullable=True), sa.Column('new_phone_alternance', mysql.TINYTEXT(), nullable=True), sa.Column('social_network', mysql.TINYTEXT(), nullable=True), ) create_table( 'update_jobs_recruiter_message', # Update jobs : comma-separated rome ids sa.Column('romes_to_add', mysql.TINYTEXT(), nullable=True), sa.Column('romes_to_remove', mysql.TINYTEXT(), nullable=True), sa.Column('romes_alternance_to_add', mysql.TINYTEXT(), nullable=True), sa.Column('romes_alternance_to_remove', mysql.TINYTEXT(), nullable=True), )
def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.create_table( 'problem_set', sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(length=100), nullable=False), sa.Column('private', sa.Boolean(), nullable=False), sa.Column('invitation_code', sa.String(length=100), nullable=True), sa.Column('show_ranklist', sa.Boolean(), nullable=False), sa.Column('problems', ormtypes.json_pickle.JsonPickle(), nullable=False), sa.Column('create_time', sa.DateTime(), nullable=False), sa.PrimaryKeyConstraint('id')) op.alter_column('contest', 'judge_result_visible', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('contest', 'ranklist_visible', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('contest', 'rated', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('discussions', 'top', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('problems', 'can_see_results', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('problems', 'public', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=True) op.alter_column('problems', 'using_file_io', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=True) op.alter_column('submissions', 'public', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=True) op.alter_column('users', 'banned', existing_type=mysql.TINYINT(display_width=1), type_=sa.Boolean(), existing_nullable=False) op.alter_column('users', 'permission_group', existing_type=mysql.TINYTEXT(collation='utf8mb4_bin'), type_=sa.Text(length=20), existing_nullable=False)
def upgrade(): op.create_table( 'candidates', sa.Column('id', sa.Integer(), nullable=False), sa.Column('created_at', sa.DateTime(), nullable=True), sa.Column('lang', mysql.TINYTEXT(), nullable=True), sa.Column('user_id', sa.Integer(), nullable=True), sa.Column('user_name', mysql.TINYTEXT(), nullable=True), sa.Column('user_registration', sa.DateTime(), nullable=True), sa.Column('user_editcount', sa.Integer(), nullable=True), sa.Column('user_editcount_quality', sa.Integer(), nullable=True), sa.Column('user_experience_level', mysql.TINYTEXT(), nullable=True), sa.Column('thanks_sent', sa.Integer(), nullable=True), sa.Column('num_prev_thanks', sa.Integer(), nullable=True), sa.Column('num_prev_thanks_90', sa.Integer(), nullable=True), sa.Column('num_prev_thanks_pre_sample', sa.Integer(), nullable=True), sa.Column('labor_hours_84_days_pre_sample', mysql.FLOAT(), nullable=True), sa.Column('has_email', sa.Boolean(), nullable=True), sa.Column('user_completed', sa.Boolean(), nullable=True), sa.Column('user_included', sa.Boolean(), nullable=True), sa.PrimaryKeyConstraint('id'), mysql_charset='utf8', #TODO needs to be utf8mb4 mysql_collate='utf8_general_ci', mysql_engine='InnoDB') # ### commands auto generated by Alembic - please adjust! ### op.create_index(op.f('ix_candidates_created_at'), 'candidates', ['created_at'], unique=False) op.create_index(op.f('ix_candidates_user_id'), 'candidates', ['user_id'], unique=False) op.create_table('edits', sa.Column('id', sa.Integer(), nullable=False), sa.Column('candidate_id', sa.Integer(), nullable=True), sa.Column('lang', mysql.TINYTEXT(), nullable=True), sa.Column('rev_id', sa.Integer(), nullable=True), sa.Column('page_name', sa.TEXT(), nullable=True), sa.Column('page_id', sa.Integer(), nullable=True), sa.Column('ores_damaging', sa.Boolean(), nullable=True), sa.Column('ores_goodfaith', sa.Boolean(), nullable=True), sa.Column('de_flagged', sa.Boolean(), nullable=True), sa.Column('de_flagged_algo_version', sa.Boolean(), nullable=True), sa.Column('edit_deleted', sa.Boolean(), nullable=True), sa.Column('diffHTML', mysql.MEDIUMTEXT(), nullable=True), sa.Column('newRevId', sa.Integer(), nullable=True), sa.Column('newRevDate', mysql.TINYTEXT(), nullable=True), sa.Column('newRevUser', mysql.TINYTEXT(), nullable=True), sa.Column('newRevComment', sa.TEXT(), nullable=True), sa.Column('oldRevId', sa.Integer(), nullable=True), sa.Column('oldRevDate', mysql.TINYTEXT(), nullable=True), sa.Column('oldRevUser', mysql.TINYTEXT(), nullable=True), sa.Column('oldRevComment', sa.TEXT(), nullable=True), sa.Column('pageTitle', mysql.TINYTEXT(), nullable=True), sa.PrimaryKeyConstraint('id'), mysql_charset='utf8', mysql_collate='utf8_general_ci', mysql_engine='InnoDB')
def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.add_column('comment', sa.Column('course_name', mysql.TINYTEXT(), nullable=True)) op.drop_column('comment', 'comment')
def load_dialect_impl(self, dialect): if _is_mysql(dialect): return mysql.TINYTEXT(charset='ascii', collation='ascii_bin') return self.impl