From 773bfa67900288c92d0cbb2b1716a23c704a02b2 Mon Sep 17 00:00:00 2001 From: Raymonf Date: Sun, 17 Dec 2023 18:58:20 -0500 Subject: [PATCH] experiment --- alembic.ini | 116 + alembic/env.py | 111 + alembic/script.py.mako | 26 + alembic/versions/eb73d9ddc113_initial.py | 3702 ++++++++++++++++++++++ core/config.py | 9 +- core/data/database.py | 31 +- core/data/schema/arcade.py | 3 +- core/data/schema/base.py | 95 +- core/data/schema/user.py | 17 +- dbutils.py | 5 + requirements.txt | 1 + titles/chuni/schema/item.py | 72 +- titles/chuni/schema/profile.py | 49 +- titles/chuni/schema/score.py | 17 +- titles/chuni/schema/static.py | 107 +- 15 files changed, 4133 insertions(+), 228 deletions(-) create mode 100644 alembic.ini create mode 100644 alembic/env.py create mode 100644 alembic/script.py.mako create mode 100644 alembic/versions/eb73d9ddc113_initial.py diff --git a/alembic.ini b/alembic.ini new file mode 100644 index 0000000..e1c9bcd --- /dev/null +++ b/alembic.ini @@ -0,0 +1,116 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = alembic + +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file +# for all available tokens +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the python>=3.9 or backports.zoneinfo library. +# Any required deps can installed by adding `alembic[tz]` to the pip requirements +# string value is passed to ZoneInfo() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to alembic/versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "version_path_separator" below. +# version_locations = %(here)s/bar:%(here)s/bat:alembic/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + +# set to 'true' to search source files recursively +# in each "version_locations" directory +# new in Alembic version 1.10 +# recursive_version_locations = false + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +sqlalchemy.url = mysql://root:root@localhost/artemis2023?charset=utf8mb4 + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# lint with attempts to fix using "ruff" - use the exec runner, execute a binary +# hooks = ruff +# ruff.type = exec +# ruff.executable = %(here)s/.venv/bin/ruff +# ruff.options = --fix REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = [%(asctime)s] %(levelname)s | %(name)s | %(message)s +datefmt = %Y-%m-%d %H:%M:%S diff --git a/alembic/env.py b/alembic/env.py new file mode 100644 index 0000000..44c26a6 --- /dev/null +++ b/alembic/env.py @@ -0,0 +1,111 @@ +from logging.config import fileConfig +from os import path + +import yaml +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +from alembic import context + +from core import CoreConfig + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +if config.config_file_name is not None: + fileConfig(config.config_file_name, disable_existing_loggers=False) + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata + +# Core +from core.data.schema import metadata + +# Titles +from titles.chuni.schema import * +from titles.cm.schema import * +from titles.cxb.schema.item import * +from titles.diva.schema import * +from titles.idac.schema import * +# from titles.idz.schema import * +from titles.mai2.schema import * +from titles.ongeki.schema import * +from titles.pokken.schema import * +from titles.sao.schema import * + +target_metadata = metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline() -> None: + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + + context.configure( + url=url, + target_metadata=target_metadata, + literal_binds=True, + dialect_opts={"paramstyle": "named"}, + ) + + with context.begin_transaction(): + context.run_migrations() + + +def get_url_from_config(): + url = config.get_main_option('artemis_db_url') + if url is not None: + return url + + import core.data.database + + cfg: CoreConfig = CoreConfig() + if path.exists(f"config/core.yaml"): + cfg.update(yaml.safe_load(open(f"config/core.yaml"))) + return core.data.database.build_db_url_from_config(cfg.database) + + +def run_migrations_online() -> None: + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + # Load config + url = get_url_from_config() + + from sqlalchemy import create_engine + engine = create_engine(url) + with engine.connect() as connection: + context.configure( + connection=connection, target_metadata=target_metadata + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/alembic/script.py.mako b/alembic/script.py.mako new file mode 100644 index 0000000..fbc4b07 --- /dev/null +++ b/alembic/script.py.mako @@ -0,0 +1,26 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision: str = ${repr(up_revision)} +down_revision: Union[str, None] = ${repr(down_revision)} +branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)} +depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)} + + +def upgrade() -> None: + ${upgrades if upgrades else "pass"} + + +def downgrade() -> None: + ${downgrades if downgrades else "pass"} diff --git a/alembic/versions/eb73d9ddc113_initial.py b/alembic/versions/eb73d9ddc113_initial.py new file mode 100644 index 0000000..9215da9 --- /dev/null +++ b/alembic/versions/eb73d9ddc113_initial.py @@ -0,0 +1,3702 @@ +"""initial + +Revision ID: eb73d9ddc113 +Revises: +Create Date: 2023-12-16 22:18:54.863441 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy import func + +# revision identifiers, used by Alembic. +revision: str = 'eb73d9ddc113' +down_revision: Union[str, None] = None +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('aime_user', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('username', sa.String(length=25), nullable=True), + sa.Column('email', sa.String(length=255), nullable=True), + sa.Column('password', sa.String(length=255), nullable=True), + sa.Column('permissions', sa.Integer(), nullable=True), + sa.Column('created_date', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.Column('last_login_date', sa.TIMESTAMP(), nullable=True), + sa.Column('suspend_expire_time', sa.TIMESTAMP(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('email'), + sa.UniqueConstraint('username'), + mysql_charset='utf8mb4' + ) + op.create_table('arcade', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('nickname', sa.String(length=255), nullable=True), + sa.Column('country', sa.String(length=3), nullable=True), + sa.Column('country_id', sa.Integer(), nullable=True), + sa.Column('state', sa.String(length=255), nullable=True), + sa.Column('city', sa.String(length=255), nullable=True), + sa.Column('region_id', sa.Integer(), nullable=True), + sa.Column('timezone', sa.String(length=255), nullable=True), + sa.Column('ip', sa.String(length=39), nullable=True), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_profile_team', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('teamName', sa.String(length=255), nullable=True), + sa.Column('teamPoint', sa.Integer(), nullable=True), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_static_avatar', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('avatarAccessoryId', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('category', sa.Integer(), nullable=True), + sa.Column('iconPath', sa.String(length=255), nullable=True), + sa.Column('texturePath', sa.String(length=255), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'avatarAccessoryId', name='chuni_static_avatar_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_static_cards', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('cardId', sa.Integer(), nullable=False), + sa.Column('charaName', sa.String(length=255), nullable=False), + sa.Column('charaId', sa.Integer(), nullable=False), + sa.Column('presentName', sa.String(length=255), nullable=False), + sa.Column('rarity', sa.Integer(), server_default='2', nullable=True), + sa.Column('labelType', sa.Integer(), nullable=False), + sa.Column('difType', sa.Integer(), nullable=False), + sa.Column('miss', sa.Integer(), nullable=False), + sa.Column('combo', sa.Integer(), nullable=False), + sa.Column('chain', sa.Integer(), nullable=False), + sa.Column('skillName', sa.String(length=255), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'cardId', name='chuni_static_cards_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_static_charge', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('chargeId', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('expirationDays', sa.Integer(), nullable=True), + sa.Column('consumeType', sa.Integer(), nullable=True), + sa.Column('sellingAppeal', sa.Boolean(), nullable=True), + sa.Column('enabled', sa.Boolean(), server_default='1', nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'chargeId', name='chuni_static_charge_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_static_events', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('eventId', sa.Integer(), nullable=True), + sa.Column('type', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('startDate', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.Column('enabled', sa.Boolean(), server_default='1', nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'eventId', name='chuni_static_events_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_static_gacha_cards', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('gachaId', sa.Integer(), nullable=False), + sa.Column('cardId', sa.Integer(), nullable=False), + sa.Column('rarity', sa.Integer(), nullable=False), + sa.Column('weight', sa.Integer(), server_default='1', nullable=True), + sa.Column('isPickup', sa.Boolean(), server_default='0', nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('gachaId', 'cardId', name='chuni_static_gacha_cards_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_static_gachas', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('gachaId', sa.Integer(), nullable=False), + sa.Column('gachaName', sa.String(length=255), nullable=False), + sa.Column('type', sa.Integer(), server_default='0', nullable=False), + sa.Column('kind', sa.Integer(), server_default='0', nullable=False), + sa.Column('isCeiling', sa.Boolean(), server_default='0', nullable=True), + sa.Column('ceilingCnt', sa.Integer(), server_default='10', nullable=True), + sa.Column('changeRateCnt1', sa.Integer(), server_default='0', nullable=True), + sa.Column('changeRateCnt2', sa.Integer(), server_default='0', nullable=True), + sa.Column('startDate', sa.TIMESTAMP(), server_default='2018-01-01 00:00:00.0', nullable=True), + sa.Column('endDate', sa.TIMESTAMP(), server_default='2038-01-01 00:00:00.0', nullable=True), + sa.Column('noticeStartDate', sa.TIMESTAMP(), server_default='2018-01-01 00:00:00.0', nullable=True), + sa.Column('noticeEndDate', sa.TIMESTAMP(), server_default='2038-01-01 00:00:00.0', nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'gachaId', 'gachaName', name='chuni_static_gachas_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_static_login_bonus_preset', + sa.Column('presetId', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('presetName', sa.String(length=255), nullable=False), + sa.Column('isEnabled', sa.Boolean(), server_default='1', nullable=True), + sa.PrimaryKeyConstraint('presetId', 'version', name='chuni_static_login_bonus_preset_pk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_static_music', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('songId', sa.Integer(), nullable=True), + sa.Column('chartId', sa.Integer(), nullable=True), + sa.Column('title', sa.String(length=255), nullable=True), + sa.Column('artist', sa.String(length=255), nullable=True), + sa.Column('level', sa.Float(), nullable=True), + sa.Column('genre', sa.String(length=255), nullable=True), + sa.Column('jacketPath', sa.String(length=255), nullable=True), + sa.Column('worldsEndTag', sa.String(length=7), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'songId', 'chartId', name='chuni_static_music_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('cxb_static_music', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('songId', sa.String(length=255), nullable=True), + sa.Column('index', sa.Integer(), nullable=True), + sa.Column('chartId', sa.Integer(), nullable=True), + sa.Column('title', sa.String(length=255), nullable=True), + sa.Column('artist', sa.String(length=255), nullable=True), + sa.Column('category', sa.String(length=255), nullable=True), + sa.Column('level', sa.Float(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'songId', 'chartId', 'index', name='cxb_static_music_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('diva_static_items', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('itemId', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('type', sa.Integer(), nullable=True), + sa.Column('points', sa.Integer(), nullable=True), + sa.Column('unknown_0', sa.Integer(), nullable=True), + sa.Column('start_date', sa.String(length=255), nullable=True), + sa.Column('end_date', sa.String(length=255), nullable=True), + sa.Column('enabled', sa.Boolean(), server_default='1', nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'itemId', name='diva_static_items_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('diva_static_music', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('songId', sa.Integer(), nullable=True), + sa.Column('chartId', sa.Integer(), nullable=True), + sa.Column('title', sa.String(length=255), nullable=True), + sa.Column('vocaloid_arranger', sa.String(length=255), nullable=True), + sa.Column('pv_illustrator', sa.String(length=255), nullable=True), + sa.Column('lyrics', sa.String(length=255), nullable=True), + sa.Column('bg_music', sa.String(length=255), nullable=True), + sa.Column('level', sa.Float(), nullable=True), + sa.Column('bpm', sa.Integer(), nullable=True), + sa.Column('date', sa.String(length=255), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'songId', 'chartId', name='diva_static_music_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('diva_static_quests', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('questId', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('quest_enable', sa.Boolean(), server_default='1', nullable=True), + sa.Column('kind', sa.Integer(), nullable=True), + sa.Column('unknown_0', sa.Integer(), nullable=True), + sa.Column('unknown_1', sa.Integer(), nullable=True), + sa.Column('unknown_2', sa.Integer(), nullable=True), + sa.Column('quest_order', sa.Integer(), nullable=True), + sa.Column('start_datetime', sa.String(length=255), nullable=True), + sa.Column('end_datetime', sa.String(length=255), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'questId', name='diva_static_quests_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('diva_static_shop', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('shopId', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('type', sa.Integer(), nullable=True), + sa.Column('points', sa.Integer(), nullable=True), + sa.Column('unknown_0', sa.Integer(), nullable=True), + sa.Column('start_date', sa.String(length=255), nullable=True), + sa.Column('end_date', sa.String(length=255), nullable=True), + sa.Column('enabled', sa.Boolean(), server_default='1', nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'shopId', name='diva_static_shop_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('event_log', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('system', sa.String(length=255), nullable=False), + sa.Column('type', sa.String(length=255), nullable=False), + sa.Column('severity', sa.Integer(), nullable=False), + sa.Column('message', sa.String(length=1000), nullable=False), + sa.Column('details', sa.JSON(), nullable=False), + sa.Column('when_logged', sa.TIMESTAMP(), server_default=func.now(), nullable=False), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_static_cards', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('cardId', sa.Integer(), nullable=False), + sa.Column('cardName', sa.String(length=255), nullable=False), + sa.Column('startDate', sa.TIMESTAMP(), server_default='2018-01-01 00:00:00.0', nullable=True), + sa.Column('endDate', sa.TIMESTAMP(), server_default='2038-01-01 00:00:00.0', nullable=True), + sa.Column('noticeStartDate', sa.TIMESTAMP(), server_default='2018-01-01 00:00:00.0', nullable=True), + sa.Column('noticeEndDate', sa.TIMESTAMP(), server_default='2038-01-01 00:00:00.0', nullable=True), + sa.Column('enabled', sa.Boolean(), server_default='1', nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'cardId', 'cardName', name='mai2_static_cards_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_static_event', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('eventId', sa.Integer(), nullable=True), + sa.Column('type', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('startDate', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.Column('enabled', sa.Boolean(), server_default='1', nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'eventId', 'type', name='mai2_static_event_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_static_music', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('songId', sa.Integer(), nullable=True), + sa.Column('chartId', sa.Integer(), nullable=True), + sa.Column('title', sa.String(length=255), nullable=True), + sa.Column('artist', sa.String(length=255), nullable=True), + sa.Column('genre', sa.String(length=255), nullable=True), + sa.Column('bpm', sa.Integer(), nullable=True), + sa.Column('addedVersion', sa.String(length=255), nullable=True), + sa.Column('difficulty', sa.Float(), nullable=True), + sa.Column('noteDesigner', sa.String(length=255), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('songId', 'chartId', 'version', name='mai2_static_music_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_static_ticket', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('ticketId', sa.Integer(), nullable=True), + sa.Column('kind', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('price', sa.Integer(), server_default='1', nullable=True), + sa.Column('enabled', sa.Boolean(), server_default='1', nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'ticketId', name='mai2_static_ticket_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_static_cards', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('cardId', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=255), nullable=False), + sa.Column('charaId', sa.Integer(), nullable=False), + sa.Column('nickName', sa.String(length=255), nullable=True), + sa.Column('school', sa.String(length=255), nullable=False), + sa.Column('attribute', sa.String(length=5), nullable=False), + sa.Column('gakunen', sa.String(length=255), nullable=False), + sa.Column('rarity', sa.Integer(), nullable=False), + sa.Column('levelParam', sa.String(length=255), nullable=False), + sa.Column('skillId', sa.Integer(), nullable=False), + sa.Column('choKaikaSkillId', sa.Integer(), nullable=False), + sa.Column('cardNumber', sa.String(length=255), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'cardId', name='ongeki_static_cards_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_static_client_testmode', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('regionId', sa.Integer(), nullable=False), + sa.Column('placeId', sa.Integer(), nullable=False), + sa.Column('clientId', sa.String(length=11), nullable=False), + sa.Column('updateDate', sa.TIMESTAMP(), nullable=False), + sa.Column('isDelivery', sa.Boolean(), nullable=False), + sa.Column('groupId', sa.Integer(), nullable=False), + sa.Column('groupRole', sa.Integer(), nullable=False), + sa.Column('continueMode', sa.Integer(), nullable=False), + sa.Column('selectMusicTime', sa.Integer(), nullable=False), + sa.Column('advertiseVolume', sa.Integer(), nullable=False), + sa.Column('eventMode', sa.Integer(), nullable=False), + sa.Column('eventMusicNum', sa.Integer(), nullable=False), + sa.Column('patternGp', sa.Integer(), nullable=False), + sa.Column('limitGp', sa.Integer(), nullable=False), + sa.Column('maxLeverMovable', sa.Integer(), nullable=False), + sa.Column('minLeverMovable', sa.Integer(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('clientId', name='ongeki_static_client_testmode_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_static_events', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('eventId', sa.Integer(), nullable=True), + sa.Column('type', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('startDate', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.Column('endDate', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.Column('enabled', sa.Boolean(), server_default='1', nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'eventId', 'type', name='ongeki_static_events_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_static_gacha_cards', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('gachaId', sa.Integer(), nullable=False), + sa.Column('cardId', sa.Integer(), nullable=False), + sa.Column('rarity', sa.Integer(), nullable=False), + sa.Column('weight', sa.Integer(), server_default='1', nullable=True), + sa.Column('isPickup', sa.Boolean(), server_default='0', nullable=True), + sa.Column('isSelect', sa.Boolean(), server_default='0', nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('gachaId', 'cardId', name='ongeki_static_gacha_cards_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_static_gachas', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('gachaId', sa.Integer(), nullable=False), + sa.Column('gachaName', sa.String(length=255), nullable=False), + sa.Column('type', sa.Integer(), server_default='0', nullable=False), + sa.Column('kind', sa.Integer(), server_default='0', nullable=False), + sa.Column('isCeiling', sa.Boolean(), server_default='0', nullable=True), + sa.Column('maxSelectPoint', sa.Integer(), server_default='0', nullable=True), + sa.Column('ceilingCnt', sa.Integer(), server_default='10', nullable=True), + sa.Column('changeRateCnt1', sa.Integer(), server_default='0', nullable=True), + sa.Column('changeRateCnt2', sa.Integer(), server_default='0', nullable=True), + sa.Column('startDate', sa.TIMESTAMP(), server_default='2018-01-01 00:00:00.0', nullable=True), + sa.Column('endDate', sa.TIMESTAMP(), server_default='2038-01-01 00:00:00.0', nullable=True), + sa.Column('noticeStartDate', sa.TIMESTAMP(), server_default='2018-01-01 00:00:00.0', nullable=True), + sa.Column('noticeEndDate', sa.TIMESTAMP(), server_default='2038-01-01 00:00:00.0', nullable=True), + sa.Column('convertEndDate', sa.TIMESTAMP(), server_default='2038-01-01 00:00:00.0', nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'gachaId', 'gachaName', name='ongeki_static_gachas_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_static_game_point', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('type', sa.Integer(), nullable=False), + sa.Column('cost', sa.Integer(), nullable=False), + sa.Column('startDate', sa.String(length=25), server_default='2000-01-01 05:00:00.0', nullable=False), + sa.Column('endDate', sa.String(length=25), server_default='2099-01-01 05:00:00.0', nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('type', name='ongeki_static_game_point_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_static_music', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('songId', sa.Integer(), nullable=True), + sa.Column('chartId', sa.Integer(), nullable=True), + sa.Column('title', sa.String(length=255), nullable=True), + sa.Column('artist', sa.String(length=255), nullable=True), + sa.Column('genre', sa.String(length=255), nullable=True), + sa.Column('level', sa.Float(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'songId', 'chartId', name='ongeki_static_music_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_static_music_ranking_list', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('musicId', sa.Integer(), nullable=False), + sa.Column('point', sa.Integer(), nullable=False), + sa.Column('userName', sa.String(length=255), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'musicId', name='ongeki_static_music_ranking_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_static_present_list', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('presentId', sa.Integer(), nullable=False), + sa.Column('presentName', sa.String(length=255), nullable=False), + sa.Column('rewardId', sa.Integer(), nullable=False), + sa.Column('stock', sa.Integer(), nullable=False), + sa.Column('message', sa.String(length=255), nullable=True), + sa.Column('startDate', sa.String(length=25), nullable=False), + sa.Column('endDate', sa.String(length=25), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'presentId', name='ongeki_static_present_list_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_static_rewards', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('rewardId', sa.Integer(), nullable=False), + sa.Column('rewardname', sa.String(length=255), nullable=False), + sa.Column('itemKind', sa.Integer(), nullable=False), + sa.Column('itemId', sa.Integer(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'rewardId', name='ongeki_static_rewards_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_static_tech_music', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('eventId', sa.Integer(), nullable=False), + sa.Column('musicId', sa.Integer(), nullable=False), + sa.Column('level', sa.Integer(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'musicId', name='ongeki_static_tech_music_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_static_equipment_list', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('equipmentId', sa.Integer(), nullable=True), + sa.Column('equipmentType', sa.Integer(), nullable=True), + sa.Column('weaponTypeId', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('rarity', sa.Integer(), nullable=True), + sa.Column('flavorText', sa.String(length=255), nullable=True), + sa.Column('enabled', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'equipmentId', name='sao_static_equipment_list_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_static_hero_list', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('heroLogId', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('nickname', sa.String(length=255), nullable=True), + sa.Column('rarity', sa.Integer(), nullable=True), + sa.Column('skillTableSubId', sa.Integer(), nullable=True), + sa.Column('awakeningExp', sa.Integer(), nullable=True), + sa.Column('flavorText', sa.String(length=255), nullable=True), + sa.Column('enabled', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'heroLogId', name='sao_static_hero_list_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_static_item_list', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('itemId', sa.Integer(), nullable=True), + sa.Column('itemTypeId', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('rarity', sa.Integer(), nullable=True), + sa.Column('flavorText', sa.String(length=255), nullable=True), + sa.Column('enabled', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'itemId', name='sao_static_item_list_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_static_quest', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('questSceneId', sa.Integer(), nullable=True), + sa.Column('sortNo', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('enabled', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'questSceneId', name='sao_static_quest_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_static_rare_drop_list', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('questRareDropId', sa.Integer(), nullable=True), + sa.Column('commonRewardId', sa.Integer(), nullable=True), + sa.Column('enabled', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'questRareDropId', 'commonRewardId', name='sao_static_rare_drop_list_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_static_support_log_list', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('supportLogId', sa.Integer(), nullable=True), + sa.Column('charaId', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=255), nullable=True), + sa.Column('rarity', sa.Integer(), nullable=True), + sa.Column('salePrice', sa.Integer(), nullable=True), + sa.Column('skillName', sa.String(length=255), nullable=True), + sa.Column('enabled', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'supportLogId', name='sao_static_support_log_list_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_static_title_list', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('titleId', sa.Integer(), nullable=True), + sa.Column('displayName', sa.String(length=255), nullable=True), + sa.Column('requirement', sa.Integer(), nullable=True), + sa.Column('rank', sa.Integer(), nullable=True), + sa.Column('imageFilePath', sa.String(length=255), nullable=True), + sa.Column('enabled', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'titleId', name='sao_static_title_list_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('schema_versions', + sa.Column('game', sa.String(length=4), nullable=False), + sa.Column('version', sa.Integer(), server_default='1', nullable=False), + sa.PrimaryKeyConstraint('game'), + mysql_charset='utf8mb4' + ) + op.create_table('aime_card', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('access_code', sa.String(length=20), nullable=True), + sa.Column('created_date', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.Column('last_login_date', sa.TIMESTAMP(), nullable=True), + sa.Column('is_locked', sa.Boolean(), server_default='0', nullable=True), + sa.Column('is_banned', sa.Boolean(), server_default='0', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'access_code', name='aime_card_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('arcade_owner', + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('arcade', sa.Integer(), nullable=False), + sa.Column('permissions', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['arcade'], ['arcade.id'], onupdate='cascade', ondelete='cascade'), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('user', 'arcade', name='arcade_owner_pk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_item_character', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('characterId', sa.Integer(), nullable=True), + sa.Column('level', sa.Integer(), nullable=True), + sa.Column('param1', sa.Integer(), nullable=True), + sa.Column('param2', sa.Integer(), nullable=True), + sa.Column('isValid', sa.Boolean(), nullable=True), + sa.Column('skillId', sa.Integer(), nullable=True), + sa.Column('isNewMark', sa.Boolean(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.Column('friendshipExp', sa.Integer(), nullable=True), + sa.Column('assignIllust', sa.Integer(), nullable=True), + sa.Column('exMaxLv', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'characterId', name='chuni_item_character_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_item_duel', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('duelId', sa.Integer(), nullable=True), + sa.Column('progress', sa.Integer(), nullable=True), + sa.Column('point', sa.Integer(), nullable=True), + sa.Column('isClear', sa.Boolean(), nullable=True), + sa.Column('lastPlayDate', sa.String(length=25), nullable=True), + sa.Column('param1', sa.Integer(), nullable=True), + sa.Column('param2', sa.Integer(), nullable=True), + sa.Column('param3', sa.Integer(), nullable=True), + sa.Column('param4', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'duelId', name='chuni_item_duel_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_item_favorite', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('favId', sa.Integer(), nullable=False), + sa.Column('favKind', sa.Integer(), server_default='1', nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'user', 'favId', name='chuni_item_favorite_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_item_gacha', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('gachaId', sa.Integer(), nullable=False), + sa.Column('totalGachaCnt', sa.Integer(), server_default='0', nullable=True), + sa.Column('ceilingGachaCnt', sa.Integer(), server_default='0', nullable=True), + sa.Column('dailyGachaCnt', sa.Integer(), server_default='0', nullable=True), + sa.Column('fiveGachaCnt', sa.Integer(), server_default='0', nullable=True), + sa.Column('elevenGachaCnt', sa.Integer(), server_default='0', nullable=True), + sa.Column('dailyGachaDate', sa.TIMESTAMP(), server_default=func.now(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'gachaId', name='chuni_item_gacha_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_item_item', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('itemId', sa.Integer(), nullable=True), + sa.Column('itemKind', sa.Integer(), nullable=True), + sa.Column('stock', sa.Integer(), nullable=True), + sa.Column('isValid', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'itemId', 'itemKind', name='chuni_item_item_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_item_login_bonus', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('presetId', sa.Integer(), nullable=False), + sa.Column('bonusCount', sa.Integer(), server_default='0', nullable=False), + sa.Column('lastUpdateDate', sa.TIMESTAMP(), server_default='2018-01-01 00:00:00.0', nullable=True), + sa.Column('isWatched', sa.Boolean(), server_default='0', nullable=True), + sa.Column('isFinished', sa.Boolean(), server_default='0', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'user', 'presetId', name='chuni_item_login_bonus_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_item_map', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('mapId', sa.Integer(), nullable=True), + sa.Column('position', sa.Integer(), nullable=True), + sa.Column('isClear', sa.Boolean(), nullable=True), + sa.Column('areaId', sa.Integer(), nullable=True), + sa.Column('routeNumber', sa.Integer(), nullable=True), + sa.Column('eventId', sa.Integer(), nullable=True), + sa.Column('rate', sa.Integer(), nullable=True), + sa.Column('statusCount', sa.Integer(), nullable=True), + sa.Column('isValid', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'mapId', name='chuni_item_map_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_item_map_area', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('mapAreaId', sa.Integer(), nullable=True), + sa.Column('rate', sa.Integer(), nullable=True), + sa.Column('isClear', sa.Boolean(), nullable=True), + sa.Column('isLocked', sa.Boolean(), nullable=True), + sa.Column('position', sa.Integer(), nullable=True), + sa.Column('statusCount', sa.Integer(), nullable=True), + sa.Column('remainGridCount', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'mapAreaId', name='chuni_item_map_area_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_item_matching', + sa.Column('roomId', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('restMSec', sa.Integer(), server_default='60', nullable=False), + sa.Column('isFull', sa.Boolean(), server_default='0', nullable=False), + sa.Column('matchingMemberInfoList', sa.JSON(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('roomId', 'version', name='chuni_item_matching_pk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_item_print_detail', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('cardId', sa.Integer(), nullable=False), + sa.Column('printDate', sa.TIMESTAMP(), nullable=False), + sa.Column('serialId', sa.String(length=20), nullable=False), + sa.Column('placeId', sa.Integer(), nullable=False), + sa.Column('clientId', sa.String(length=11), nullable=False), + sa.Column('printerSerialId', sa.String(length=20), nullable=False), + sa.Column('printOption1', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption2', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption3', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption4', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption5', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption6', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption7', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption8', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption9', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption10', sa.Boolean(), server_default='0', nullable=True), + sa.Column('created', sa.String(length=255), server_default='', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('serialId', name='chuni_item_print_detail_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_item_print_state', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('hasCompleted', sa.Boolean(), server_default='0', nullable=False), + sa.Column('limitDate', sa.TIMESTAMP(), server_default='2038-01-01 00:00:00.0', nullable=False), + sa.Column('placeId', sa.Integer(), nullable=True), + sa.Column('cardId', sa.Integer(), nullable=True), + sa.Column('gachaId', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('id', 'user', name='chuni_item_print_state_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_profile_activity', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('kind', sa.Integer(), nullable=True), + sa.Column('activityId', sa.Integer(), nullable=True), + sa.Column('sortNumber', sa.Integer(), nullable=True), + sa.Column('param1', sa.Integer(), nullable=True), + sa.Column('param2', sa.Integer(), nullable=True), + sa.Column('param3', sa.Integer(), nullable=True), + sa.Column('param4', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'kind', 'activityId', name='chuni_profile_activity_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_profile_charge', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('chargeId', sa.Integer(), nullable=True), + sa.Column('stock', sa.Integer(), nullable=True), + sa.Column('purchaseDate', sa.String(length=25), nullable=True), + sa.Column('validDate', sa.String(length=25), nullable=True), + sa.Column('param1', sa.Integer(), nullable=True), + sa.Column('param2', sa.Integer(), nullable=True), + sa.Column('paramDate', sa.String(length=25), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'chargeId', name='chuni_profile_charge_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_profile_data', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('exp', sa.Integer(), nullable=True), + sa.Column('level', sa.Integer(), nullable=True), + sa.Column('point', sa.Integer(), nullable=True), + sa.Column('frameId', sa.Integer(), nullable=True), + sa.Column('isMaimai', sa.Boolean(), nullable=True), + sa.Column('trophyId', sa.Integer(), nullable=True), + sa.Column('userName', sa.String(length=25), nullable=True), + sa.Column('isWebJoin', sa.Boolean(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.Column('lastGameId', sa.String(length=25), nullable=True), + sa.Column('totalPoint', sa.BigInteger(), nullable=True), + sa.Column('characterId', sa.Integer(), nullable=True), + sa.Column('firstGameId', sa.String(length=25), nullable=True), + sa.Column('friendCount', sa.Integer(), nullable=True), + sa.Column('lastPlaceId', sa.Integer(), nullable=True), + sa.Column('nameplateId', sa.Integer(), nullable=True), + sa.Column('totalMapNum', sa.Integer(), nullable=True), + sa.Column('lastAllNetId', sa.Integer(), nullable=True), + sa.Column('lastClientId', sa.String(length=25), nullable=True), + sa.Column('lastPlayDate', sa.String(length=25), nullable=True), + sa.Column('lastRegionId', sa.Integer(), nullable=True), + sa.Column('playerRating', sa.Integer(), nullable=True), + sa.Column('totalHiScore', sa.Integer(), nullable=True), + sa.Column('webLimitDate', sa.String(length=25), nullable=True), + sa.Column('firstPlayDate', sa.String(length=25), nullable=True), + sa.Column('highestRating', sa.Integer(), nullable=True), + sa.Column('lastPlaceName', sa.String(length=25), nullable=True), + sa.Column('multiWinCount', sa.Integer(), nullable=True), + sa.Column('acceptResCount', sa.Integer(), nullable=True), + sa.Column('lastRegionName', sa.String(length=25), nullable=True), + sa.Column('lastRomVersion', sa.String(length=25), nullable=True), + sa.Column('multiPlayCount', sa.Integer(), nullable=True), + sa.Column('firstRomVersion', sa.String(length=25), nullable=True), + sa.Column('lastDataVersion', sa.String(length=25), nullable=True), + sa.Column('requestResCount', sa.Integer(), nullable=True), + sa.Column('successResCount', sa.Integer(), nullable=True), + sa.Column('eventWatchedDate', sa.String(length=25), nullable=True), + sa.Column('firstDataVersion', sa.String(length=25), nullable=True), + sa.Column('reincarnationNum', sa.Integer(), nullable=True), + sa.Column('playedTutorialBit', sa.Integer(), nullable=True), + sa.Column('totalBasicHighScore', sa.Integer(), nullable=True), + sa.Column('totalExpertHighScore', sa.Integer(), nullable=True), + sa.Column('totalMasterHighScore', sa.Integer(), nullable=True), + sa.Column('totalRepertoireCount', sa.Integer(), nullable=True), + sa.Column('firstTutorialCancelNum', sa.Integer(), nullable=True), + sa.Column('totalAdvancedHighScore', sa.Integer(), nullable=True), + sa.Column('masterTutorialCancelNum', sa.Integer(), nullable=True), + sa.Column('ext1', sa.Integer(), nullable=True), + sa.Column('ext2', sa.Integer(), nullable=True), + sa.Column('ext3', sa.Integer(), nullable=True), + sa.Column('ext4', sa.Integer(), nullable=True), + sa.Column('ext5', sa.Integer(), nullable=True), + sa.Column('ext6', sa.Integer(), nullable=True), + sa.Column('ext7', sa.Integer(), nullable=True), + sa.Column('ext8', sa.Integer(), nullable=True), + sa.Column('ext9', sa.Integer(), nullable=True), + sa.Column('ext10', sa.Integer(), nullable=True), + sa.Column('extStr1', sa.String(length=255), nullable=True), + sa.Column('extStr2', sa.String(length=255), nullable=True), + sa.Column('extLong1', sa.Integer(), nullable=True), + sa.Column('extLong2', sa.Integer(), nullable=True), + sa.Column('mapIconId', sa.Integer(), nullable=True), + sa.Column('compatibleCmVersion', sa.String(length=25), nullable=True), + sa.Column('medal', sa.Integer(), nullable=True), + sa.Column('voiceId', sa.Integer(), nullable=True), + sa.Column('teamId', sa.Integer(), nullable=True), + sa.Column('eliteRankPoint', sa.Integer(), server_default='0', nullable=True), + sa.Column('stockedGridCount', sa.Integer(), server_default='0', nullable=True), + sa.Column('netBattleLoseCount', sa.Integer(), server_default='0', nullable=True), + sa.Column('netBattleHostErrCnt', sa.Integer(), server_default='0', nullable=True), + sa.Column('netBattle4thCount', sa.Integer(), server_default='0', nullable=True), + sa.Column('overPowerRate', sa.Integer(), server_default='0', nullable=True), + sa.Column('battleRewardStatus', sa.Integer(), server_default='0', nullable=True), + sa.Column('netBattle1stCount', sa.Integer(), server_default='0', nullable=True), + sa.Column('charaIllustId', sa.Integer(), server_default='0', nullable=True), + sa.Column('userNameEx', sa.String(length=8), server_default='', nullable=True), + sa.Column('netBattleWinCount', sa.Integer(), server_default='0', nullable=True), + sa.Column('netBattleCorrection', sa.Integer(), server_default='0', nullable=True), + sa.Column('classEmblemMedal', sa.Integer(), server_default='0', nullable=True), + sa.Column('overPowerPoint', sa.Integer(), server_default='0', nullable=True), + sa.Column('netBattleErrCnt', sa.Integer(), server_default='0', nullable=True), + sa.Column('battleRankId', sa.Integer(), server_default='0', nullable=True), + sa.Column('netBattle3rdCount', sa.Integer(), server_default='0', nullable=True), + sa.Column('netBattleConsecutiveWinCount', sa.Integer(), server_default='0', nullable=True), + sa.Column('overPowerLowerRank', sa.Integer(), server_default='0', nullable=True), + sa.Column('classEmblemBase', sa.Integer(), server_default='0', nullable=True), + sa.Column('battleRankPoint', sa.Integer(), server_default='0', nullable=True), + sa.Column('netBattle2ndCount', sa.Integer(), server_default='0', nullable=True), + sa.Column('totalUltimaHighScore', sa.Integer(), server_default='0', nullable=True), + sa.Column('skillId', sa.Integer(), server_default='0', nullable=True), + sa.Column('lastCountryCode', sa.String(length=5), server_default='JPN', nullable=True), + sa.Column('isNetBattleHost', sa.Boolean(), server_default='0', nullable=True), + sa.Column('battleRewardCount', sa.Integer(), server_default='0', nullable=True), + sa.Column('battleRewardIndex', sa.Integer(), server_default='0', nullable=True), + sa.Column('netBattlePlayCount', sa.Integer(), server_default='0', nullable=True), + sa.Column('exMapLoopCount', sa.Integer(), server_default='0', nullable=True), + sa.Column('netBattleEndState', sa.Integer(), server_default='0', nullable=True), + sa.Column('rankUpChallengeResults', sa.JSON(), nullable=True), + sa.Column('avatarBack', sa.Integer(), server_default='0', nullable=True), + sa.Column('avatarFace', sa.Integer(), server_default='0', nullable=True), + sa.Column('avatarPoint', sa.Integer(), server_default='0', nullable=True), + sa.Column('avatarItem', sa.Integer(), server_default='0', nullable=True), + sa.Column('avatarWear', sa.Integer(), server_default='0', nullable=True), + sa.Column('avatarFront', sa.Integer(), server_default='0', nullable=True), + sa.Column('avatarSkin', sa.Integer(), server_default='0', nullable=True), + sa.Column('avatarHead', sa.Integer(), server_default='0', nullable=True), + sa.ForeignKeyConstraint(['teamId'], ['chuni_profile_team.id'], onupdate='SET NULL', ondelete='SET NULL'), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='chuni_profile_profile_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_profile_data_ex', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('ext1', sa.Integer(), nullable=True), + sa.Column('ext2', sa.Integer(), nullable=True), + sa.Column('ext3', sa.Integer(), nullable=True), + sa.Column('ext4', sa.Integer(), nullable=True), + sa.Column('ext5', sa.Integer(), nullable=True), + sa.Column('ext6', sa.Integer(), nullable=True), + sa.Column('ext7', sa.Integer(), nullable=True), + sa.Column('ext8', sa.Integer(), nullable=True), + sa.Column('ext9', sa.Integer(), nullable=True), + sa.Column('ext10', sa.Integer(), nullable=True), + sa.Column('ext11', sa.Integer(), nullable=True), + sa.Column('ext12', sa.Integer(), nullable=True), + sa.Column('ext13', sa.Integer(), nullable=True), + sa.Column('ext14', sa.Integer(), nullable=True), + sa.Column('ext15', sa.Integer(), nullable=True), + sa.Column('ext16', sa.Integer(), nullable=True), + sa.Column('ext17', sa.Integer(), nullable=True), + sa.Column('ext18', sa.Integer(), nullable=True), + sa.Column('ext19', sa.Integer(), nullable=True), + sa.Column('ext20', sa.Integer(), nullable=True), + sa.Column('medal', sa.Integer(), nullable=True), + sa.Column('extStr1', sa.String(length=255), nullable=True), + sa.Column('extStr2', sa.String(length=255), nullable=True), + sa.Column('extStr3', sa.String(length=255), nullable=True), + sa.Column('extStr4', sa.String(length=255), nullable=True), + sa.Column('extStr5', sa.String(length=255), nullable=True), + sa.Column('voiceId', sa.Integer(), nullable=True), + sa.Column('extLong1', sa.Integer(), nullable=True), + sa.Column('extLong2', sa.Integer(), nullable=True), + sa.Column('extLong3', sa.Integer(), nullable=True), + sa.Column('extLong4', sa.Integer(), nullable=True), + sa.Column('extLong5', sa.Integer(), nullable=True), + sa.Column('mapIconId', sa.Integer(), nullable=True), + sa.Column('compatibleCmVersion', sa.String(length=25), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='chuni_profile_data_ex_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_profile_emoney', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('ext1', sa.Integer(), nullable=True), + sa.Column('ext2', sa.Integer(), nullable=True), + sa.Column('ext3', sa.Integer(), nullable=True), + sa.Column('type', sa.Integer(), nullable=True), + sa.Column('emoneyBrand', sa.Integer(), nullable=True), + sa.Column('emoneyCredit', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'emoneyBrand', name='chuni_profile_emoney_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_profile_option', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('speed', sa.Integer(), nullable=True), + sa.Column('bgInfo', sa.Integer(), nullable=True), + sa.Column('rating', sa.Integer(), nullable=True), + sa.Column('privacy', sa.Integer(), nullable=True), + sa.Column('judgePos', sa.Integer(), nullable=True), + sa.Column('matching', sa.Integer(), nullable=True), + sa.Column('guideLine', sa.Integer(), nullable=True), + sa.Column('headphone', sa.Integer(), nullable=True), + sa.Column('optionSet', sa.Integer(), nullable=True), + sa.Column('fieldColor', sa.Integer(), nullable=True), + sa.Column('guideSound', sa.Integer(), nullable=True), + sa.Column('successAir', sa.Integer(), nullable=True), + sa.Column('successTap', sa.Integer(), nullable=True), + sa.Column('judgeAttack', sa.Integer(), nullable=True), + sa.Column('playerLevel', sa.Integer(), nullable=True), + sa.Column('soundEffect', sa.Integer(), nullable=True), + sa.Column('judgeJustice', sa.Integer(), nullable=True), + sa.Column('successExTap', sa.Integer(), nullable=True), + sa.Column('successFlick', sa.Integer(), nullable=True), + sa.Column('successSkill', sa.Integer(), nullable=True), + sa.Column('successSlideHold', sa.Integer(), nullable=True), + sa.Column('successTapTimbre', sa.Integer(), nullable=True), + sa.Column('ext1', sa.Integer(), nullable=True), + sa.Column('ext2', sa.Integer(), nullable=True), + sa.Column('ext3', sa.Integer(), nullable=True), + sa.Column('ext4', sa.Integer(), nullable=True), + sa.Column('ext5', sa.Integer(), nullable=True), + sa.Column('ext6', sa.Integer(), nullable=True), + sa.Column('ext7', sa.Integer(), nullable=True), + sa.Column('ext8', sa.Integer(), nullable=True), + sa.Column('ext9', sa.Integer(), nullable=True), + sa.Column('ext10', sa.Integer(), nullable=True), + sa.Column('categoryDetail', sa.Integer(), server_default='0', nullable=True), + sa.Column('judgeTimingOffset_120', sa.Integer(), server_default='0', nullable=True), + sa.Column('resultVoiceShort', sa.Integer(), server_default='0', nullable=True), + sa.Column('judgeAppendSe', sa.Integer(), server_default='0', nullable=True), + sa.Column('judgeCritical', sa.Integer(), server_default='0', nullable=True), + sa.Column('trackSkip', sa.Integer(), server_default='0', nullable=True), + sa.Column('selectMusicFilterLv', sa.Integer(), server_default='0', nullable=True), + sa.Column('sortMusicFilterLv', sa.Integer(), server_default='0', nullable=True), + sa.Column('sortMusicGenre', sa.Integer(), server_default='0', nullable=True), + sa.Column('speed_120', sa.Integer(), server_default='0', nullable=True), + sa.Column('judgeTimingOffset', sa.Integer(), server_default='0', nullable=True), + sa.Column('mirrorFumen', sa.Integer(), server_default='0', nullable=True), + sa.Column('playTimingOffset_120', sa.Integer(), server_default='0', nullable=True), + sa.Column('hardJudge', sa.Integer(), server_default='0', nullable=True), + sa.Column('notesThickness', sa.Integer(), server_default='0', nullable=True), + sa.Column('fieldWallPosition', sa.Integer(), server_default='0', nullable=True), + sa.Column('playTimingOffset', sa.Integer(), server_default='0', nullable=True), + sa.Column('fieldWallPosition_120', sa.Integer(), server_default='0', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', name='chuni_profile_option_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_profile_option_ex', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('ext1', sa.Integer(), nullable=True), + sa.Column('ext2', sa.Integer(), nullable=True), + sa.Column('ext3', sa.Integer(), nullable=True), + sa.Column('ext4', sa.Integer(), nullable=True), + sa.Column('ext5', sa.Integer(), nullable=True), + sa.Column('ext6', sa.Integer(), nullable=True), + sa.Column('ext7', sa.Integer(), nullable=True), + sa.Column('ext8', sa.Integer(), nullable=True), + sa.Column('ext9', sa.Integer(), nullable=True), + sa.Column('ext10', sa.Integer(), nullable=True), + sa.Column('ext11', sa.Integer(), nullable=True), + sa.Column('ext12', sa.Integer(), nullable=True), + sa.Column('ext13', sa.Integer(), nullable=True), + sa.Column('ext14', sa.Integer(), nullable=True), + sa.Column('ext15', sa.Integer(), nullable=True), + sa.Column('ext16', sa.Integer(), nullable=True), + sa.Column('ext17', sa.Integer(), nullable=True), + sa.Column('ext18', sa.Integer(), nullable=True), + sa.Column('ext19', sa.Integer(), nullable=True), + sa.Column('ext20', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', name='chuni_profile_option_ex_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_profile_overpower', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('genreId', sa.Integer(), nullable=True), + sa.Column('difficulty', sa.Integer(), nullable=True), + sa.Column('rate', sa.Integer(), nullable=True), + sa.Column('point', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'genreId', 'difficulty', name='chuni_profile_emoney_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_profile_recent_rating', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('recentRating', sa.JSON(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', name='chuni_profile_recent_rating_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_profile_region', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('regionId', sa.Integer(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'regionId', name='chuni_profile_region_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_score_best', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('musicId', sa.Integer(), nullable=True), + sa.Column('level', sa.Integer(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.Column('scoreMax', sa.Integer(), nullable=True), + sa.Column('resRequestCount', sa.Integer(), nullable=True), + sa.Column('resAcceptCount', sa.Integer(), nullable=True), + sa.Column('resSuccessCount', sa.Integer(), nullable=True), + sa.Column('missCount', sa.Integer(), nullable=True), + sa.Column('maxComboCount', sa.Integer(), nullable=True), + sa.Column('isFullCombo', sa.Boolean(), nullable=True), + sa.Column('isAllJustice', sa.Boolean(), nullable=True), + sa.Column('isSuccess', sa.Integer(), nullable=True), + sa.Column('fullChain', sa.Integer(), nullable=True), + sa.Column('maxChain', sa.Integer(), nullable=True), + sa.Column('scoreRank', sa.Integer(), nullable=True), + sa.Column('isLock', sa.Boolean(), nullable=True), + sa.Column('ext1', sa.Integer(), nullable=True), + sa.Column('theoryCount', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'musicId', 'level', name='chuni_score_best_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_score_course', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('courseId', sa.Integer(), nullable=True), + sa.Column('classId', sa.Integer(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.Column('scoreMax', sa.Integer(), nullable=True), + sa.Column('isFullCombo', sa.Boolean(), nullable=True), + sa.Column('isAllJustice', sa.Boolean(), nullable=True), + sa.Column('isSuccess', sa.Integer(), nullable=True), + sa.Column('scoreRank', sa.Integer(), nullable=True), + sa.Column('eventId', sa.Integer(), nullable=True), + sa.Column('lastPlayDate', sa.String(length=25), nullable=True), + sa.Column('param1', sa.Integer(), nullable=True), + sa.Column('param2', sa.Integer(), nullable=True), + sa.Column('param3', sa.Integer(), nullable=True), + sa.Column('param4', sa.Integer(), nullable=True), + sa.Column('isClear', sa.Integer(), nullable=True), + sa.Column('theoryCount', sa.Integer(), nullable=True), + sa.Column('orderId', sa.Integer(), nullable=True), + sa.Column('playerRating', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'courseId', name='chuni_score_course_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_score_playlog', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('orderId', sa.Integer(), nullable=True), + sa.Column('sortNumber', sa.Integer(), nullable=True), + sa.Column('placeId', sa.Integer(), nullable=True), + sa.Column('playDate', sa.String(length=20), nullable=True), + sa.Column('userPlayDate', sa.String(length=20), nullable=True), + sa.Column('musicId', sa.Integer(), nullable=True), + sa.Column('level', sa.Integer(), nullable=True), + sa.Column('customId', sa.Integer(), nullable=True), + sa.Column('playedUserId1', sa.Integer(), nullable=True), + sa.Column('playedUserId2', sa.Integer(), nullable=True), + sa.Column('playedUserId3', sa.Integer(), nullable=True), + sa.Column('playedUserName1', sa.String(length=20), nullable=True), + sa.Column('playedUserName2', sa.String(length=20), nullable=True), + sa.Column('playedUserName3', sa.String(length=20), nullable=True), + sa.Column('playedMusicLevel1', sa.Integer(), nullable=True), + sa.Column('playedMusicLevel2', sa.Integer(), nullable=True), + sa.Column('playedMusicLevel3', sa.Integer(), nullable=True), + sa.Column('playedCustom1', sa.Integer(), nullable=True), + sa.Column('playedCustom2', sa.Integer(), nullable=True), + sa.Column('playedCustom3', sa.Integer(), nullable=True), + sa.Column('track', sa.Integer(), nullable=True), + sa.Column('score', sa.Integer(), nullable=True), + sa.Column('rank', sa.Integer(), nullable=True), + sa.Column('maxCombo', sa.Integer(), nullable=True), + sa.Column('maxChain', sa.Integer(), nullable=True), + sa.Column('rateTap', sa.Integer(), nullable=True), + sa.Column('rateHold', sa.Integer(), nullable=True), + sa.Column('rateSlide', sa.Integer(), nullable=True), + sa.Column('rateAir', sa.Integer(), nullable=True), + sa.Column('rateFlick', sa.Integer(), nullable=True), + sa.Column('judgeGuilty', sa.Integer(), nullable=True), + sa.Column('judgeAttack', sa.Integer(), nullable=True), + sa.Column('judgeJustice', sa.Integer(), nullable=True), + sa.Column('judgeCritical', sa.Integer(), nullable=True), + sa.Column('eventId', sa.Integer(), nullable=True), + sa.Column('playerRating', sa.Integer(), nullable=True), + sa.Column('isNewRecord', sa.Boolean(), nullable=True), + sa.Column('isFullCombo', sa.Boolean(), nullable=True), + sa.Column('fullChainKind', sa.Integer(), nullable=True), + sa.Column('isAllJustice', sa.Boolean(), nullable=True), + sa.Column('isContinue', sa.Boolean(), nullable=True), + sa.Column('isFreeToPlay', sa.Boolean(), nullable=True), + sa.Column('characterId', sa.Integer(), nullable=True), + sa.Column('skillId', sa.Integer(), nullable=True), + sa.Column('playKind', sa.Integer(), nullable=True), + sa.Column('isClear', sa.Integer(), nullable=True), + sa.Column('skillLevel', sa.Integer(), nullable=True), + sa.Column('skillEffect', sa.Integer(), nullable=True), + sa.Column('placeName', sa.String(length=255), nullable=True), + sa.Column('isMaimai', sa.Boolean(), nullable=True), + sa.Column('commonId', sa.Integer(), nullable=True), + sa.Column('charaIllustId', sa.Integer(), nullable=True), + sa.Column('romVersion', sa.String(length=255), nullable=True), + sa.Column('judgeHeaven', sa.Integer(), nullable=True), + sa.Column('regionId', sa.Integer(), nullable=True), + sa.Column('machineType', sa.Integer(), nullable=True), + sa.Column('ticketId', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('chuni_static_login_bonus', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('presetId', sa.Integer(), nullable=False), + sa.Column('loginBonusId', sa.Integer(), nullable=False), + sa.Column('loginBonusName', sa.String(length=255), nullable=False), + sa.Column('presentId', sa.Integer(), nullable=False), + sa.Column('presentName', sa.String(length=255), nullable=False), + sa.Column('itemNum', sa.Integer(), nullable=False), + sa.Column('needLoginDayCount', sa.Integer(), nullable=False), + sa.Column('loginBonusCategoryType', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['presetId', 'version'], ['chuni_static_login_bonus_preset.presetId', 'chuni_static_login_bonus_preset.version'], name='chuni_static_login_bonus_ibfk_1', onupdate='CASCADE', ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('version', 'presetId', 'loginBonusId', name='chuni_static_login_bonus_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('cxb_playlog', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('song_mcode', sa.String(length=7), nullable=True), + sa.Column('chart_id', sa.Integer(), nullable=True), + sa.Column('score', sa.Integer(), nullable=True), + sa.Column('clear', sa.Integer(), nullable=True), + sa.Column('flawless', sa.Integer(), nullable=True), + sa.Column('super', sa.Integer(), nullable=True), + sa.Column('cool', sa.Integer(), nullable=True), + sa.Column('fast', sa.Integer(), nullable=True), + sa.Column('fast2', sa.Integer(), nullable=True), + sa.Column('slow', sa.Integer(), nullable=True), + sa.Column('slow2', sa.Integer(), nullable=True), + sa.Column('fail', sa.Integer(), nullable=True), + sa.Column('combo', sa.Integer(), nullable=True), + sa.Column('date_scored', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('cxb_profile', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('index', sa.Integer(), nullable=False), + sa.Column('data', sa.JSON(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'index', name='cxb_profile_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('cxb_ranking', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('rev_id', sa.Integer(), nullable=True), + sa.Column('song_id', sa.Integer(), nullable=True), + sa.Column('score', sa.Integer(), nullable=True), + sa.Column('clear', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'rev_id', name='cxb_ranking_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('cxb_rev_energy', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('energy', sa.Integer(), server_default='0', nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', name='cxb_rev_energy_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('cxb_score', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('game_version', sa.Integer(), nullable=True), + sa.Column('song_mcode', sa.String(length=7), nullable=True), + sa.Column('song_index', sa.Integer(), nullable=True), + sa.Column('data', sa.JSON(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'song_mcode', 'song_index', name='cxb_score_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('diva_playlog', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('pv_id', sa.Integer(), nullable=True), + sa.Column('difficulty', sa.Integer(), nullable=True), + sa.Column('edition', sa.Integer(), nullable=True), + sa.Column('score', sa.Integer(), nullable=True), + sa.Column('atn_pnt', sa.Integer(), nullable=True), + sa.Column('clr_kind', sa.Integer(), nullable=True), + sa.Column('sort_kind', sa.Integer(), nullable=True), + sa.Column('cool', sa.Integer(), nullable=True), + sa.Column('fine', sa.Integer(), nullable=True), + sa.Column('safe', sa.Integer(), nullable=True), + sa.Column('sad', sa.Integer(), nullable=True), + sa.Column('worst', sa.Integer(), nullable=True), + sa.Column('max_combo', sa.Integer(), nullable=True), + sa.Column('date_scored', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('diva_profile', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('player_name', sa.String(length=10), nullable=False), + sa.Column('lv_str', sa.String(length=24), server_default="Dab on 'em", nullable=False), + sa.Column('lv_num', sa.Integer(), server_default='0', nullable=False), + sa.Column('lv_pnt', sa.Integer(), server_default='0', nullable=False), + sa.Column('vcld_pts', sa.Integer(), server_default='0', nullable=False), + sa.Column('hp_vol', sa.Integer(), server_default='100', nullable=False), + sa.Column('btn_se_vol', sa.Integer(), server_default='100', nullable=False), + sa.Column('btn_se_vol2', sa.Integer(), server_default='100', nullable=False), + sa.Column('sldr_se_vol2', sa.Integer(), server_default='100', nullable=False), + sa.Column('sort_kind', sa.Integer(), server_default='2', nullable=False), + sa.Column('use_pv_mdl_eqp', sa.Boolean(), server_default='1', nullable=False), + sa.Column('use_mdl_pri', sa.Boolean(), server_default='0', nullable=False), + sa.Column('use_pv_skn_eqp', sa.Boolean(), server_default='0', nullable=False), + sa.Column('use_pv_btn_se_eqp', sa.Boolean(), server_default='1', nullable=False), + sa.Column('use_pv_sld_se_eqp', sa.Boolean(), server_default='0', nullable=False), + sa.Column('use_pv_chn_sld_se_eqp', sa.Boolean(), server_default='0', nullable=False), + sa.Column('use_pv_sldr_tch_se_eqp', sa.Boolean(), server_default='0', nullable=False), + sa.Column('btn_se_eqp', sa.Integer(), server_default='-1', nullable=False), + sa.Column('sld_se_eqp', sa.Integer(), server_default='-1', nullable=False), + sa.Column('chn_sld_se_eqp', sa.Integer(), server_default='-1', nullable=False), + sa.Column('sldr_tch_se_eqp', sa.Integer(), server_default='-1', nullable=False), + sa.Column('nxt_pv_id', sa.Integer(), server_default='708', nullable=False), + sa.Column('nxt_dffclty', sa.Integer(), server_default='2', nullable=False), + sa.Column('nxt_edtn', sa.Integer(), server_default='0', nullable=False), + sa.Column('cnp_cid', sa.Integer(), server_default='-1', nullable=False), + sa.Column('cnp_val', sa.Integer(), server_default='-1', nullable=False), + sa.Column('cnp_rr', sa.Integer(), server_default='-1', nullable=False), + sa.Column('cnp_sp', sa.String(length=255), server_default='', nullable=False), + sa.Column('dsp_clr_brdr', sa.Integer(), server_default='7', nullable=False), + sa.Column('dsp_intrm_rnk', sa.Integer(), server_default='1', nullable=False), + sa.Column('dsp_clr_sts', sa.Integer(), server_default='1', nullable=False), + sa.Column('rgo_sts', sa.Integer(), server_default='1', nullable=False), + sa.Column('lv_efct_id', sa.Integer(), server_default='0', nullable=False), + sa.Column('lv_plt_id', sa.Integer(), server_default='1', nullable=False), + sa.Column('skn_eqp', sa.Integer(), server_default='0', nullable=False), + sa.Column('passwd_stat', sa.Integer(), server_default='0', nullable=False), + sa.Column('passwd', sa.String(length=12), server_default='**********', nullable=False), + sa.Column('my_qst_id', sa.String(length=128), server_default='-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1', nullable=True), + sa.Column('my_qst_sts', sa.String(length=128), server_default='-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='diva_profile_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('diva_profile_customize_item', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('item_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', 'item_id', name='diva_profile_customize_item_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('diva_profile_module', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('module_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', 'module_id', name='diva_profile_module_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('diva_profile_pv_customize', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('pv_id', sa.Integer(), nullable=False), + sa.Column('mdl_eqp_ary', sa.String(length=14), server_default='-999,-999,-999', nullable=True), + sa.Column('c_itm_eqp_ary', sa.String(length=59), server_default='-999,-999,-999,-999,-999,-999,-999,-999,-999,-999,-999,-999', nullable=True), + sa.Column('ms_itm_flg_ary', sa.String(length=59), server_default='-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1', nullable=True), + sa.Column('skin', sa.Integer(), server_default='-1', nullable=True), + sa.Column('btn_se', sa.Integer(), server_default='-1', nullable=True), + sa.Column('sld_se', sa.Integer(), server_default='-1', nullable=True), + sa.Column('chsld_se', sa.Integer(), server_default='-1', nullable=True), + sa.Column('sldtch_se', sa.Integer(), server_default='-1', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', 'pv_id', name='diva_profile_pv_customize_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('diva_profile_shop', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('mdl_eqp_ary', sa.String(length=32), nullable=True), + sa.Column('c_itm_eqp_ary', sa.String(length=59), nullable=True), + sa.Column('ms_itm_flg_ary', sa.String(length=59), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='diva_profile_shop_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('diva_score', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('pv_id', sa.Integer(), nullable=True), + sa.Column('difficulty', sa.Integer(), nullable=True), + sa.Column('edition', sa.Integer(), nullable=True), + sa.Column('score', sa.Integer(), nullable=True), + sa.Column('atn_pnt', sa.Integer(), nullable=True), + sa.Column('clr_kind', sa.Integer(), nullable=True), + sa.Column('sort_kind', sa.Integer(), nullable=True), + sa.Column('cool', sa.Integer(), nullable=True), + sa.Column('fine', sa.Integer(), nullable=True), + sa.Column('safe', sa.Integer(), nullable=True), + sa.Column('sad', sa.Integer(), nullable=True), + sa.Column('worst', sa.Integer(), nullable=True), + sa.Column('max_combo', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'pv_id', 'difficulty', 'edition', name='diva_score_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_profile', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('username', sa.String(length=8), nullable=True), + sa.Column('country', sa.Integer(), nullable=True), + sa.Column('store', sa.Integer(), nullable=True), + sa.Column('team_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('total_play', sa.Integer(), server_default='0', nullable=True), + sa.Column('daily_play', sa.Integer(), server_default='0', nullable=True), + sa.Column('day_play', sa.Integer(), server_default='0', nullable=True), + sa.Column('mileage', sa.Integer(), server_default='0', nullable=True), + sa.Column('asset_version', sa.Integer(), server_default='1', nullable=True), + sa.Column('last_play_date', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.Column('mytitle_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('mytitle_efffect_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('sticker_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('sticker_effect_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('papercup_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('tachometer_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('aura_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('aura_color_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('aura_line_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('bgm_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('keyholder_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('start_menu_bg_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('use_car_id', sa.Integer(), server_default='1', nullable=True), + sa.Column('use_style_car_id', sa.Integer(), server_default='1', nullable=True), + sa.Column('bothwin_count', sa.Integer(), server_default='0', nullable=True), + sa.Column('bothwin_score', sa.Integer(), server_default='0', nullable=True), + sa.Column('subcard_count', sa.Integer(), server_default='0', nullable=True), + sa.Column('vs_history', sa.Integer(), server_default='0', nullable=True), + sa.Column('stamp_key_assign_0', sa.Integer(), nullable=True), + sa.Column('stamp_key_assign_1', sa.Integer(), nullable=True), + sa.Column('stamp_key_assign_2', sa.Integer(), nullable=True), + sa.Column('stamp_key_assign_3', sa.Integer(), nullable=True), + sa.Column('name_change_category', sa.Integer(), server_default='0', nullable=True), + sa.Column('factory_disp', sa.Integer(), server_default='0', nullable=True), + sa.Column('create_date', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.Column('cash', sa.Integer(), server_default='0', nullable=True), + sa.Column('dressup_point', sa.Integer(), server_default='0', nullable=True), + sa.Column('avatar_point', sa.Integer(), server_default='0', nullable=True), + sa.Column('total_cash', sa.Integer(), server_default='0', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='idac_profile_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_profile_avatar', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('sex', sa.Integer(), nullable=True), + sa.Column('face', sa.Integer(), nullable=True), + sa.Column('eye', sa.Integer(), nullable=True), + sa.Column('mouth', sa.Integer(), nullable=True), + sa.Column('hair', sa.Integer(), nullable=True), + sa.Column('glasses', sa.Integer(), nullable=True), + sa.Column('face_accessory', sa.Integer(), nullable=True), + sa.Column('body', sa.Integer(), nullable=True), + sa.Column('body_accessory', sa.Integer(), nullable=True), + sa.Column('behind', sa.Integer(), nullable=True), + sa.Column('bg', sa.Integer(), nullable=True), + sa.Column('effect', sa.Integer(), nullable=True), + sa.Column('special', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', name='idac_profile_avatar_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_profile_config', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('config_id', sa.Integer(), nullable=True), + sa.Column('steering_intensity', sa.Integer(), nullable=True), + sa.Column('transmission_type', sa.Integer(), nullable=True), + sa.Column('default_viewpoint', sa.Integer(), nullable=True), + sa.Column('favorite_bgm', sa.Integer(), nullable=True), + sa.Column('bgm_volume', sa.Integer(), nullable=True), + sa.Column('se_volume', sa.Integer(), nullable=True), + sa.Column('master_volume', sa.Integer(), nullable=True), + sa.Column('store_battle_policy', sa.Integer(), nullable=True), + sa.Column('battle_onomatope_display', sa.Integer(), nullable=True), + sa.Column('cornering_guide', sa.Integer(), nullable=True), + sa.Column('minimap', sa.Integer(), nullable=True), + sa.Column('line_guide', sa.Integer(), nullable=True), + sa.Column('ghost', sa.Integer(), nullable=True), + sa.Column('race_exit', sa.Integer(), nullable=True), + sa.Column('result_skip', sa.Integer(), nullable=True), + sa.Column('stamp_select_skip', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', name='idac_profile_config_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_profile_rank', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('story_rank_exp', sa.Integer(), server_default='0', nullable=True), + sa.Column('story_rank', sa.Integer(), server_default='1', nullable=True), + sa.Column('time_trial_rank_exp', sa.Integer(), server_default='0', nullable=True), + sa.Column('time_trial_rank', sa.Integer(), server_default='1', nullable=True), + sa.Column('online_battle_rank_exp', sa.Integer(), server_default='0', nullable=True), + sa.Column('online_battle_rank', sa.Integer(), server_default='1', nullable=True), + sa.Column('store_battle_rank_exp', sa.Integer(), server_default='0', nullable=True), + sa.Column('store_battle_rank', sa.Integer(), server_default='1', nullable=True), + sa.Column('theory_exp', sa.Integer(), server_default='0', nullable=True), + sa.Column('theory_rank', sa.Integer(), server_default='1', nullable=True), + sa.Column('pride_group_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('pride_point', sa.Integer(), server_default='0', nullable=True), + sa.Column('grade_exp', sa.Integer(), server_default='0', nullable=True), + sa.Column('grade', sa.Integer(), server_default='1', nullable=True), + sa.Column('grade_reward_dist', sa.Integer(), server_default='0', nullable=True), + sa.Column('story_rank_reward_dist', sa.Integer(), server_default='0', nullable=True), + sa.Column('time_trial_rank_reward_dist', sa.Integer(), server_default='0', nullable=True), + sa.Column('online_battle_rank_reward_dist', sa.Integer(), server_default='0', nullable=True), + sa.Column('store_battle_rank_reward_dist', sa.Integer(), server_default='0', nullable=True), + sa.Column('theory_rank_reward_dist', sa.Integer(), server_default='0', nullable=True), + sa.Column('max_attained_online_battle_rank', sa.Integer(), server_default='1', nullable=True), + sa.Column('max_attained_pride_point', sa.Integer(), server_default='0', nullable=True), + sa.Column('is_last_max', sa.Integer(), server_default='0', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='idac_profile_rank_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_profile_stock', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('mytitle_list', sa.String(length=1024), server_default='', nullable=True), + sa.Column('mytitle_new_list', sa.String(length=1024), server_default='', nullable=True), + sa.Column('avatar_face_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_face_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_eye_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_eye_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_hair_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_hair_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_body_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_body_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_mouth_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_mouth_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_glasses_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_glasses_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_face_accessory_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_face_accessory_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_body_accessory_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_body_accessory_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_behind_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_behind_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_bg_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_bg_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_effect_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_effect_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_special_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('avatar_special_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('stamp_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('stamp_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('keyholder_list', sa.String(length=256), server_default='', nullable=True), + sa.Column('keyholder_new_list', sa.String(length=256), server_default='', nullable=True), + sa.Column('papercup_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('papercup_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('tachometer_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('tachometer_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('aura_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('aura_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('aura_color_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('aura_color_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('aura_line_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('aura_line_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('bgm_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('bgm_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('dx_color_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('dx_color_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('start_menu_bg_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('start_menu_bg_new_list', sa.String(length=255), server_default='', nullable=True), + sa.Column('under_neon_list', sa.String(length=255), server_default='', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='idac_profile_stock_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_profile_theory', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('play_count', sa.Integer(), server_default='0', nullable=True), + sa.Column('play_count_multi', sa.Integer(), server_default='0', nullable=True), + sa.Column('partner_id', sa.Integer(), nullable=True), + sa.Column('partner_progress', sa.Integer(), nullable=True), + sa.Column('partner_progress_score', sa.Integer(), nullable=True), + sa.Column('practice_start_rank', sa.Integer(), server_default='0', nullable=True), + sa.Column('general_flag', sa.Integer(), server_default='0', nullable=True), + sa.Column('vs_history', sa.Integer(), server_default='0', nullable=True), + sa.Column('vs_history_multi', sa.Integer(), server_default='0', nullable=True), + sa.Column('win_count', sa.Integer(), server_default='0', nullable=True), + sa.Column('win_count_multi', sa.Integer(), server_default='0', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='idac_profile_theory_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_car', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('car_id', sa.Integer(), nullable=True), + sa.Column('style_car_id', sa.Integer(), nullable=True), + sa.Column('color', sa.Integer(), nullable=True), + sa.Column('bureau', sa.Integer(), nullable=True), + sa.Column('kana', sa.Integer(), nullable=True), + sa.Column('s_no', sa.Integer(), nullable=True), + sa.Column('l_no', sa.Integer(), nullable=True), + sa.Column('car_flag', sa.Integer(), nullable=True), + sa.Column('tune_point', sa.Integer(), nullable=True), + sa.Column('tune_level', sa.Integer(), server_default='1', nullable=True), + sa.Column('tune_parts', sa.Integer(), nullable=True), + sa.Column('infinity_tune', sa.Integer(), server_default='0', nullable=True), + sa.Column('online_vs_win', sa.Integer(), server_default='0', nullable=True), + sa.Column('pickup_seq', sa.Integer(), server_default='1', nullable=True), + sa.Column('purchase_seq', sa.Integer(), server_default='1', nullable=True), + sa.Column('color_stock_list', sa.String(length=32), nullable=True), + sa.Column('color_stock_new_list', sa.String(length=32), nullable=True), + sa.Column('parts_stock_list', sa.String(length=48), nullable=True), + sa.Column('parts_stock_new_list', sa.String(length=48), nullable=True), + sa.Column('parts_set_equip_list', sa.String(length=48), nullable=True), + sa.Column('parts_list', sa.JSON(), nullable=True), + sa.Column('equip_parts_count', sa.Integer(), server_default='0', nullable=True), + sa.Column('total_car_parts_count', sa.Integer(), server_default='0', nullable=True), + sa.Column('use_count', sa.Integer(), server_default='0', nullable=True), + sa.Column('story_use_count', sa.Integer(), server_default='0', nullable=True), + sa.Column('timetrial_use_count', sa.Integer(), server_default='0', nullable=True), + sa.Column('vs_use_count', sa.Integer(), server_default='0', nullable=True), + sa.Column('net_vs_use_count', sa.Integer(), server_default='0', nullable=True), + sa.Column('theory_use_count', sa.Integer(), server_default='0', nullable=True), + sa.Column('car_mileage', sa.Integer(), server_default='0', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', 'style_car_id', name='idac_user_car_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_challenge', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('vs_type', sa.Integer(), nullable=True), + sa.Column('play_difficulty', sa.Integer(), nullable=True), + sa.Column('cleared_difficulty', sa.Integer(), nullable=True), + sa.Column('story_type', sa.Integer(), nullable=True), + sa.Column('play_count', sa.Integer(), server_default='1', nullable=True), + sa.Column('weak_difficulty', sa.Integer(), server_default='0', nullable=True), + sa.Column('eval_id', sa.Integer(), nullable=True), + sa.Column('advantage', sa.Integer(), nullable=True), + sa.Column('sec1_advantage_avg', sa.Integer(), nullable=True), + sa.Column('sec2_advantage_avg', sa.Integer(), nullable=True), + sa.Column('sec3_advantage_avg', sa.Integer(), nullable=True), + sa.Column('sec4_advantage_avg', sa.Integer(), nullable=True), + sa.Column('nearby_advantage_rate', sa.Integer(), nullable=True), + sa.Column('win_flag', sa.Integer(), nullable=True), + sa.Column('result', sa.Integer(), nullable=True), + sa.Column('record', sa.Integer(), nullable=True), + sa.Column('course_id', sa.Integer(), nullable=True), + sa.Column('last_play_course_id', sa.Integer(), nullable=True), + sa.Column('style_car_id', sa.Integer(), nullable=True), + sa.Column('course_day', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'vs_type', 'play_difficulty', name='idac_user_challenge_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_course', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('course_id', sa.Integer(), nullable=True), + sa.Column('run_counts', sa.Integer(), server_default='1', nullable=True), + sa.Column('skill_level_exp', sa.Integer(), server_default='0', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'course_id', name='idac_user_course_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_stamp', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('m_stamp_event_id', sa.Integer(), nullable=True), + sa.Column('select_flag', sa.Integer(), nullable=True), + sa.Column('stamp_masu', sa.Integer(), nullable=True), + sa.Column('daily_bonus', sa.Integer(), nullable=True), + sa.Column('weekly_bonus', sa.Integer(), nullable=True), + sa.Column('weekday_bonus', sa.Integer(), nullable=True), + sa.Column('weekend_bonus', sa.Integer(), nullable=True), + sa.Column('total_bonus', sa.Integer(), nullable=True), + sa.Column('day_total_bonus', sa.Integer(), nullable=True), + sa.Column('store_battle_bonus', sa.Integer(), nullable=True), + sa.Column('story_bonus', sa.Integer(), nullable=True), + sa.Column('online_battle_bonus', sa.Integer(), nullable=True), + sa.Column('timetrial_bonus', sa.Integer(), nullable=True), + sa.Column('fasteststreetlegaltheory_bonus', sa.Integer(), nullable=True), + sa.Column('collaboration_bonus', sa.Integer(), nullable=True), + sa.Column('add_bonus_daily_flag_1', sa.Integer(), nullable=True), + sa.Column('add_bonus_daily_flag_2', sa.Integer(), nullable=True), + sa.Column('add_bonus_daily_flag_3', sa.Integer(), nullable=True), + sa.Column('create_date_daily', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.Column('create_date_weekly', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'm_stamp_event_id', name='idac_user_stamp_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_story', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('story_type', sa.Integer(), nullable=True), + sa.Column('chapter', sa.Integer(), nullable=True), + sa.Column('loop_count', sa.Integer(), server_default='1', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'chapter', name='idac_user_story_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_story_episode', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('chapter', sa.Integer(), nullable=True), + sa.Column('episode', sa.Integer(), nullable=True), + sa.Column('play_status', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'chapter', 'episode', name='idac_user_story_episode_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_story_episode_difficulty', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('episode', sa.Integer(), nullable=True), + sa.Column('difficulty', sa.Integer(), nullable=True), + sa.Column('play_count', sa.Integer(), nullable=True), + sa.Column('clear_count', sa.Integer(), nullable=True), + sa.Column('play_status', sa.Integer(), nullable=True), + sa.Column('play_score', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'episode', 'difficulty', name='idac_user_story_episode_difficulty_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_theory_course', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('course_id', sa.Integer(), nullable=True), + sa.Column('max_victory_grade', sa.Integer(), server_default='0', nullable=True), + sa.Column('run_count', sa.Integer(), server_default='1', nullable=True), + sa.Column('powerhouse_lv', sa.Integer(), nullable=True), + sa.Column('powerhouse_exp', sa.Integer(), nullable=True), + sa.Column('played_powerhouse_lv', sa.Integer(), nullable=True), + sa.Column('update_dt', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'course_id', name='idac_user_theory_course_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_theory_partner', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('partner_id', sa.Integer(), nullable=True), + sa.Column('fellowship_lv', sa.Integer(), nullable=True), + sa.Column('fellowship_exp', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'partner_id', name='idac_user_theory_partner_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_theory_running', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('course_id', sa.Integer(), nullable=True), + sa.Column('attack', sa.Integer(), nullable=True), + sa.Column('defense', sa.Integer(), nullable=True), + sa.Column('safety', sa.Integer(), nullable=True), + sa.Column('runaway', sa.Integer(), nullable=True), + sa.Column('trick_flag', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'course_id', name='idac_user_theory_running_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_ticket', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('ticket_id', sa.Integer(), nullable=True), + sa.Column('ticket_cnt', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'ticket_id', name='idac_user_ticket_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_time_trial', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('style_car_id', sa.Integer(), nullable=True), + sa.Column('course_id', sa.Integer(), nullable=True), + sa.Column('eval_id', sa.Integer(), server_default='0', nullable=True), + sa.Column('goal_time', sa.Integer(), nullable=True), + sa.Column('section_time_1', sa.Integer(), nullable=True), + sa.Column('section_time_2', sa.Integer(), nullable=True), + sa.Column('section_time_3', sa.Integer(), nullable=True), + sa.Column('section_time_4', sa.Integer(), nullable=True), + sa.Column('mission', sa.Integer(), nullable=True), + sa.Column('play_dt', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', 'course_id', 'style_car_id', name='idac_user_time_trial_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_timetrial_event', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('timetrial_event_id', sa.Integer(), nullable=True), + sa.Column('point', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'timetrial_event_id', name='idac_user_timetrial_event_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('idac_user_vs_info', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('group_key', sa.String(length=25), nullable=True), + sa.Column('win_flg', sa.Integer(), nullable=True), + sa.Column('style_car_id', sa.Integer(), nullable=True), + sa.Column('course_id', sa.Integer(), nullable=True), + sa.Column('course_day', sa.Integer(), nullable=True), + sa.Column('players_num', sa.Integer(), nullable=True), + sa.Column('winning', sa.Integer(), nullable=True), + sa.Column('advantage_1', sa.Integer(), nullable=True), + sa.Column('advantage_2', sa.Integer(), nullable=True), + sa.Column('advantage_3', sa.Integer(), nullable=True), + sa.Column('advantage_4', sa.Integer(), nullable=True), + sa.Column('select_course_id', sa.Integer(), nullable=True), + sa.Column('select_course_day', sa.Integer(), nullable=True), + sa.Column('select_course_random', sa.Integer(), nullable=True), + sa.Column('matching_success_sec', sa.Integer(), nullable=True), + sa.Column('boost_flag', sa.Integer(), nullable=True), + sa.Column('vs_history', sa.Integer(), nullable=True), + sa.Column('break_count', sa.Integer(), nullable=True), + sa.Column('break_penalty_flag', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'group_key', name='idac_user_vs_info_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('machine', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('arcade', sa.Integer(), nullable=False), + sa.Column('serial', sa.String(length=15), nullable=False), + sa.Column('board', sa.String(length=15), nullable=True), + sa.Column('game', sa.String(length=4), nullable=True), + sa.Column('country', sa.String(length=3), nullable=True), + sa.Column('timezone', sa.String(length=255), nullable=True), + sa.Column('ota_enable', sa.Boolean(), nullable=True), + sa.Column('memo', sa.String(length=255), nullable=True), + sa.Column('is_cab', sa.Boolean(), nullable=True), + sa.Column('data', sa.JSON(), nullable=True), + sa.ForeignKeyConstraint(['arcade'], ['arcade.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_item_card', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('cardId', sa.Integer(), nullable=True), + sa.Column('cardTypeId', sa.Integer(), nullable=True), + sa.Column('charaId', sa.Integer(), nullable=True), + sa.Column('mapId', sa.Integer(), nullable=True), + sa.Column('startDate', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.Column('endDate', sa.TIMESTAMP(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'cardId', 'cardTypeId', name='mai2_item_card_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_item_character', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('characterId', sa.Integer(), nullable=True), + sa.Column('level', sa.Integer(), nullable=True), + sa.Column('awakening', sa.Integer(), nullable=True), + sa.Column('useCount', sa.Integer(), nullable=True), + sa.Column('point', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'characterId', name='mai2_item_character_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_item_charge', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('chargeId', sa.Integer(), nullable=True), + sa.Column('stock', sa.Integer(), nullable=True), + sa.Column('purchaseDate', sa.String(length=255), nullable=True), + sa.Column('validDate', sa.String(length=255), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'chargeId', name='mai2_item_charge_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_item_favorite', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('itemKind', sa.Integer(), nullable=True), + sa.Column('itemIdList', sa.JSON(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'itemKind', name='mai2_item_favorite_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_item_friend_season_ranking', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('seasonId', sa.Integer(), nullable=True), + sa.Column('point', sa.Integer(), nullable=True), + sa.Column('rank', sa.Integer(), nullable=True), + sa.Column('rewardGet', sa.Boolean(), nullable=True), + sa.Column('userName', sa.String(length=8), nullable=True), + sa.Column('recordDate', sa.TIMESTAMP(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'seasonId', 'userName', name='mai2_item_friend_season_ranking_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_item_item', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('itemId', sa.Integer(), nullable=True), + sa.Column('itemKind', sa.Integer(), nullable=True), + sa.Column('stock', sa.Integer(), nullable=True), + sa.Column('isValid', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'itemId', 'itemKind', name='mai2_item_item_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_item_login_bonus', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('bonusId', sa.Integer(), nullable=True), + sa.Column('point', sa.Integer(), nullable=True), + sa.Column('isCurrent', sa.Boolean(), nullable=True), + sa.Column('isComplete', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'bonusId', name='mai2_item_login_bonus_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_item_map', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('mapId', sa.Integer(), nullable=True), + sa.Column('distance', sa.Integer(), nullable=True), + sa.Column('isLock', sa.Boolean(), nullable=True), + sa.Column('isClear', sa.Boolean(), nullable=True), + sa.Column('isComplete', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'mapId', name='mai2_item_map_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_item_print_detail', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('orderId', sa.Integer(), nullable=True), + sa.Column('printNumber', sa.Integer(), nullable=True), + sa.Column('printDate', sa.TIMESTAMP(), server_default=func.now(), nullable=True), + sa.Column('serialId', sa.String(length=20), nullable=True), + sa.Column('placeId', sa.Integer(), nullable=True), + sa.Column('clientId', sa.String(length=11), nullable=True), + sa.Column('printerSerialId', sa.String(length=20), nullable=True), + sa.Column('cardRomVersion', sa.Integer(), nullable=True), + sa.Column('isHolograph', sa.Boolean(), server_default='1', nullable=True), + sa.Column('printOption1', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption2', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption3', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption4', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption5', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption6', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption7', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption8', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption9', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption10', sa.Boolean(), server_default='0', nullable=True), + sa.Column('created', sa.String(length=255), server_default='', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'serialId', name='mai2_item_print_detail_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_playlog', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('userId', sa.BigInteger(), nullable=True), + sa.Column('orderId', sa.Integer(), nullable=True), + sa.Column('playlogId', sa.BigInteger(), nullable=True), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('placeId', sa.Integer(), nullable=True), + sa.Column('placeName', sa.String(length=255), nullable=True), + sa.Column('loginDate', sa.BigInteger(), nullable=True), + sa.Column('playDate', sa.String(length=255), nullable=True), + sa.Column('userPlayDate', sa.String(length=255), nullable=True), + sa.Column('type', sa.Integer(), nullable=True), + sa.Column('musicId', sa.Integer(), nullable=True), + sa.Column('level', sa.Integer(), nullable=True), + sa.Column('trackNo', sa.Integer(), nullable=True), + sa.Column('vsMode', sa.Integer(), nullable=True), + sa.Column('vsUserName', sa.String(length=255), nullable=True), + sa.Column('vsStatus', sa.Integer(), nullable=True), + sa.Column('vsUserRating', sa.Integer(), nullable=True), + sa.Column('vsUserAchievement', sa.Integer(), nullable=True), + sa.Column('vsUserGradeRank', sa.Integer(), nullable=True), + sa.Column('vsRank', sa.Integer(), nullable=True), + sa.Column('playerNum', sa.Integer(), nullable=True), + sa.Column('playedUserId1', sa.BigInteger(), nullable=True), + sa.Column('playedUserName1', sa.String(length=255), nullable=True), + sa.Column('playedMusicLevel1', sa.Integer(), nullable=True), + sa.Column('playedUserId2', sa.BigInteger(), nullable=True), + sa.Column('playedUserName2', sa.String(length=255), nullable=True), + sa.Column('playedMusicLevel2', sa.Integer(), nullable=True), + sa.Column('playedUserId3', sa.BigInteger(), nullable=True), + sa.Column('playedUserName3', sa.String(length=255), nullable=True), + sa.Column('playedMusicLevel3', sa.Integer(), nullable=True), + sa.Column('characterId1', sa.Integer(), nullable=True), + sa.Column('characterLevel1', sa.Integer(), nullable=True), + sa.Column('characterAwakening1', sa.Integer(), nullable=True), + sa.Column('characterId2', sa.Integer(), nullable=True), + sa.Column('characterLevel2', sa.Integer(), nullable=True), + sa.Column('characterAwakening2', sa.Integer(), nullable=True), + sa.Column('characterId3', sa.Integer(), nullable=True), + sa.Column('characterLevel3', sa.Integer(), nullable=True), + sa.Column('characterAwakening3', sa.Integer(), nullable=True), + sa.Column('characterId4', sa.Integer(), nullable=True), + sa.Column('characterLevel4', sa.Integer(), nullable=True), + sa.Column('characterAwakening4', sa.Integer(), nullable=True), + sa.Column('characterId5', sa.Integer(), nullable=True), + sa.Column('characterLevel5', sa.Integer(), nullable=True), + sa.Column('characterAwakening5', sa.Integer(), nullable=True), + sa.Column('achievement', sa.Integer(), nullable=True), + sa.Column('deluxscore', sa.Integer(), nullable=True), + sa.Column('scoreRank', sa.Integer(), nullable=True), + sa.Column('maxCombo', sa.Integer(), nullable=True), + sa.Column('totalCombo', sa.Integer(), nullable=True), + sa.Column('maxSync', sa.Integer(), nullable=True), + sa.Column('totalSync', sa.Integer(), nullable=True), + sa.Column('tapCriticalPerfect', sa.Integer(), nullable=True), + sa.Column('tapPerfect', sa.Integer(), nullable=True), + sa.Column('tapGreat', sa.Integer(), nullable=True), + sa.Column('tapGood', sa.Integer(), nullable=True), + sa.Column('tapMiss', sa.Integer(), nullable=True), + sa.Column('holdCriticalPerfect', sa.Integer(), nullable=True), + sa.Column('holdPerfect', sa.Integer(), nullable=True), + sa.Column('holdGreat', sa.Integer(), nullable=True), + sa.Column('holdGood', sa.Integer(), nullable=True), + sa.Column('holdMiss', sa.Integer(), nullable=True), + sa.Column('slideCriticalPerfect', sa.Integer(), nullable=True), + sa.Column('slidePerfect', sa.Integer(), nullable=True), + sa.Column('slideGreat', sa.Integer(), nullable=True), + sa.Column('slideGood', sa.Integer(), nullable=True), + sa.Column('slideMiss', sa.Integer(), nullable=True), + sa.Column('touchCriticalPerfect', sa.Integer(), nullable=True), + sa.Column('touchPerfect', sa.Integer(), nullable=True), + sa.Column('touchGreat', sa.Integer(), nullable=True), + sa.Column('touchGood', sa.Integer(), nullable=True), + sa.Column('touchMiss', sa.Integer(), nullable=True), + sa.Column('breakCriticalPerfect', sa.Integer(), nullable=True), + sa.Column('breakPerfect', sa.Integer(), nullable=True), + sa.Column('breakGreat', sa.Integer(), nullable=True), + sa.Column('breakGood', sa.Integer(), nullable=True), + sa.Column('breakMiss', sa.Integer(), nullable=True), + sa.Column('isTap', sa.Boolean(), nullable=True), + sa.Column('isHold', sa.Boolean(), nullable=True), + sa.Column('isSlide', sa.Boolean(), nullable=True), + sa.Column('isTouch', sa.Boolean(), nullable=True), + sa.Column('isBreak', sa.Boolean(), nullable=True), + sa.Column('isCriticalDisp', sa.Boolean(), nullable=True), + sa.Column('isFastLateDisp', sa.Boolean(), nullable=True), + sa.Column('fastCount', sa.Integer(), nullable=True), + sa.Column('lateCount', sa.Integer(), nullable=True), + sa.Column('isAchieveNewRecord', sa.Boolean(), nullable=True), + sa.Column('isDeluxscoreNewRecord', sa.Boolean(), nullable=True), + sa.Column('comboStatus', sa.Integer(), nullable=True), + sa.Column('syncStatus', sa.Integer(), nullable=True), + sa.Column('isClear', sa.Boolean(), nullable=True), + sa.Column('beforeRating', sa.Integer(), nullable=True), + sa.Column('afterRating', sa.Integer(), nullable=True), + sa.Column('beforeGrade', sa.Integer(), nullable=True), + sa.Column('afterGrade', sa.Integer(), nullable=True), + sa.Column('afterGradeRank', sa.Integer(), nullable=True), + sa.Column('beforeDeluxRating', sa.Integer(), nullable=True), + sa.Column('afterDeluxRating', sa.Integer(), nullable=True), + sa.Column('isPlayTutorial', sa.Boolean(), nullable=True), + sa.Column('isEventMode', sa.Boolean(), nullable=True), + sa.Column('isFreedomMode', sa.Boolean(), nullable=True), + sa.Column('playMode', sa.Integer(), nullable=True), + sa.Column('isNewFree', sa.Boolean(), nullable=True), + sa.Column('extNum1', sa.Integer(), nullable=True), + sa.Column('extNum2', sa.Integer(), nullable=True), + sa.Column('extNum4', sa.Integer(), server_default='0', nullable=True), + sa.Column('trialPlayAchievement', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_profile_activity', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('kind', sa.Integer(), nullable=True), + sa.Column('activityId', sa.Integer(), nullable=True), + sa.Column('param1', sa.Integer(), nullable=True), + sa.Column('param2', sa.Integer(), nullable=True), + sa.Column('param3', sa.Integer(), nullable=True), + sa.Column('param4', sa.Integer(), nullable=True), + sa.Column('sortNumber', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'kind', 'activityId', name='mai2_profile_activity_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_profile_consec_logins', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('logins', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='mai2_profile_consec_logins_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_profile_detail', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('userName', sa.String(length=25), nullable=True), + sa.Column('isNetMember', sa.Integer(), nullable=True), + sa.Column('iconId', sa.Integer(), nullable=True), + sa.Column('plateId', sa.Integer(), nullable=True), + sa.Column('titleId', sa.Integer(), nullable=True), + sa.Column('partnerId', sa.Integer(), nullable=True), + sa.Column('frameId', sa.Integer(), nullable=True), + sa.Column('selectMapId', sa.Integer(), nullable=True), + sa.Column('totalAwake', sa.Integer(), nullable=True), + sa.Column('gradeRating', sa.Integer(), nullable=True), + sa.Column('musicRating', sa.Integer(), nullable=True), + sa.Column('playerRating', sa.Integer(), nullable=True), + sa.Column('highestRating', sa.Integer(), nullable=True), + sa.Column('gradeRank', sa.Integer(), nullable=True), + sa.Column('classRank', sa.Integer(), nullable=True), + sa.Column('courseRank', sa.Integer(), nullable=True), + sa.Column('charaSlot', sa.JSON(), nullable=True), + sa.Column('charaLockSlot', sa.JSON(), nullable=True), + sa.Column('contentBit', sa.BigInteger(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.Column('mapStock', sa.Integer(), nullable=True), + sa.Column('eventWatchedDate', sa.String(length=25), nullable=True), + sa.Column('lastGameId', sa.String(length=25), nullable=True), + sa.Column('lastRomVersion', sa.String(length=25), nullable=True), + sa.Column('lastDataVersion', sa.String(length=25), nullable=True), + sa.Column('lastLoginDate', sa.String(length=25), nullable=True), + sa.Column('lastPairLoginDate', sa.String(length=25), nullable=True), + sa.Column('lastPlayDate', sa.String(length=25), nullable=True), + sa.Column('lastTrialPlayDate', sa.String(length=25), nullable=True), + sa.Column('lastPlayCredit', sa.Integer(), nullable=True), + sa.Column('lastPlayMode', sa.Integer(), nullable=True), + sa.Column('lastPlaceId', sa.Integer(), nullable=True), + sa.Column('lastPlaceName', sa.String(length=25), nullable=True), + sa.Column('lastAllNetId', sa.Integer(), nullable=True), + sa.Column('lastRegionId', sa.Integer(), nullable=True), + sa.Column('lastRegionName', sa.String(length=25), nullable=True), + sa.Column('lastClientId', sa.String(length=25), nullable=True), + sa.Column('lastCountryCode', sa.String(length=25), nullable=True), + sa.Column('lastSelectEMoney', sa.Integer(), nullable=True), + sa.Column('lastSelectTicket', sa.Integer(), nullable=True), + sa.Column('lastSelectCourse', sa.Integer(), nullable=True), + sa.Column('lastCountCourse', sa.Integer(), nullable=True), + sa.Column('firstGameId', sa.String(length=25), nullable=True), + sa.Column('firstRomVersion', sa.String(length=25), nullable=True), + sa.Column('firstDataVersion', sa.String(length=25), nullable=True), + sa.Column('firstPlayDate', sa.String(length=25), nullable=True), + sa.Column('compatibleCmVersion', sa.String(length=25), nullable=True), + sa.Column('dailyBonusDate', sa.String(length=25), nullable=True), + sa.Column('dailyCourseBonusDate', sa.String(length=25), nullable=True), + sa.Column('playVsCount', sa.Integer(), nullable=True), + sa.Column('playSyncCount', sa.Integer(), nullable=True), + sa.Column('winCount', sa.Integer(), nullable=True), + sa.Column('helpCount', sa.Integer(), nullable=True), + sa.Column('comboCount', sa.Integer(), nullable=True), + sa.Column('totalDeluxscore', sa.BigInteger(), nullable=True), + sa.Column('totalBasicDeluxscore', sa.BigInteger(), nullable=True), + sa.Column('totalAdvancedDeluxscore', sa.BigInteger(), nullable=True), + sa.Column('totalExpertDeluxscore', sa.BigInteger(), nullable=True), + sa.Column('totalMasterDeluxscore', sa.BigInteger(), nullable=True), + sa.Column('totalReMasterDeluxscore', sa.BigInteger(), nullable=True), + sa.Column('totalSync', sa.Integer(), nullable=True), + sa.Column('totalBasicSync', sa.Integer(), nullable=True), + sa.Column('totalAdvancedSync', sa.Integer(), nullable=True), + sa.Column('totalExpertSync', sa.Integer(), nullable=True), + sa.Column('totalMasterSync', sa.Integer(), nullable=True), + sa.Column('totalReMasterSync', sa.Integer(), nullable=True), + sa.Column('totalAchievement', sa.BigInteger(), nullable=True), + sa.Column('totalBasicAchievement', sa.BigInteger(), nullable=True), + sa.Column('totalAdvancedAchievement', sa.BigInteger(), nullable=True), + sa.Column('totalExpertAchievement', sa.BigInteger(), nullable=True), + sa.Column('totalMasterAchievement', sa.BigInteger(), nullable=True), + sa.Column('totalReMasterAchievement', sa.BigInteger(), nullable=True), + sa.Column('playerOldRating', sa.BigInteger(), nullable=True), + sa.Column('playerNewRating', sa.BigInteger(), nullable=True), + sa.Column('dateTime', sa.BigInteger(), nullable=True), + sa.Column('banState', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='mai2_profile_detail_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_profile_extend', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('selectMusicId', sa.Integer(), nullable=True), + sa.Column('selectDifficultyId', sa.Integer(), nullable=True), + sa.Column('categoryIndex', sa.Integer(), nullable=True), + sa.Column('musicIndex', sa.Integer(), nullable=True), + sa.Column('extraFlag', sa.Integer(), nullable=True), + sa.Column('selectScoreType', sa.Integer(), nullable=True), + sa.Column('extendContentBit', sa.BigInteger(), nullable=True), + sa.Column('isPhotoAgree', sa.Boolean(), nullable=True), + sa.Column('isGotoCodeRead', sa.Boolean(), nullable=True), + sa.Column('selectResultDetails', sa.Boolean(), nullable=True), + sa.Column('selectResultScoreViewType', sa.Integer(), nullable=True), + sa.Column('sortCategorySetting', sa.Integer(), nullable=True), + sa.Column('sortMusicSetting', sa.Integer(), nullable=True), + sa.Column('selectedCardList', sa.JSON(), nullable=True), + sa.Column('encountMapNpcList', sa.JSON(), nullable=True), + sa.Column('playStatusSetting', sa.Integer(), server_default='0', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='mai2_profile_extend_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_profile_ghost', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version_int', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=25), nullable=True), + sa.Column('iconId', sa.Integer(), nullable=True), + sa.Column('plateId', sa.Integer(), nullable=True), + sa.Column('titleId', sa.Integer(), nullable=True), + sa.Column('rate', sa.Integer(), nullable=True), + sa.Column('udemaeRate', sa.Integer(), nullable=True), + sa.Column('courseRank', sa.Integer(), nullable=True), + sa.Column('classRank', sa.Integer(), nullable=True), + sa.Column('classValue', sa.Integer(), nullable=True), + sa.Column('playDatetime', sa.String(length=25), nullable=True), + sa.Column('shopId', sa.Integer(), nullable=True), + sa.Column('regionCode', sa.Integer(), nullable=True), + sa.Column('typeId', sa.Integer(), nullable=True), + sa.Column('musicId', sa.Integer(), nullable=True), + sa.Column('difficulty', sa.Integer(), nullable=True), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('resultBitList', sa.JSON(), nullable=True), + sa.Column('resultNum', sa.Integer(), nullable=True), + sa.Column('achievement', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', 'musicId', 'difficulty', name='mai2_profile_ghost_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_profile_option', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('selectMusicId', sa.Integer(), nullable=True), + sa.Column('optionKind', sa.Integer(), nullable=True), + sa.Column('noteSpeed', sa.Integer(), nullable=True), + sa.Column('slideSpeed', sa.Integer(), nullable=True), + sa.Column('touchSpeed', sa.Integer(), nullable=True), + sa.Column('tapDesign', sa.Integer(), nullable=True), + sa.Column('tapSe', sa.Integer(), server_default='0', nullable=True), + sa.Column('holdDesign', sa.Integer(), nullable=True), + sa.Column('slideDesign', sa.Integer(), nullable=True), + sa.Column('starType', sa.Integer(), nullable=True), + sa.Column('outlineDesign', sa.Integer(), nullable=True), + sa.Column('noteSize', sa.Integer(), nullable=True), + sa.Column('slideSize', sa.Integer(), nullable=True), + sa.Column('touchSize', sa.Integer(), nullable=True), + sa.Column('starRotate', sa.Integer(), nullable=True), + sa.Column('dispCenter', sa.Integer(), nullable=True), + sa.Column('outFrameType', sa.Integer(), nullable=True), + sa.Column('dispChain', sa.Integer(), nullable=True), + sa.Column('dispRate', sa.Integer(), nullable=True), + sa.Column('dispBar', sa.Integer(), nullable=True), + sa.Column('touchEffect', sa.Integer(), nullable=True), + sa.Column('submonitorAnimation', sa.Integer(), nullable=True), + sa.Column('submonitorAchive', sa.Integer(), nullable=True), + sa.Column('submonitorAppeal', sa.Integer(), nullable=True), + sa.Column('matching', sa.Integer(), nullable=True), + sa.Column('trackSkip', sa.Integer(), nullable=True), + sa.Column('brightness', sa.Integer(), nullable=True), + sa.Column('mirrorMode', sa.Integer(), nullable=True), + sa.Column('dispJudge', sa.Integer(), nullable=True), + sa.Column('dispJudgePos', sa.Integer(), nullable=True), + sa.Column('dispJudgeTouchPos', sa.Integer(), nullable=True), + sa.Column('adjustTiming', sa.Integer(), nullable=True), + sa.Column('judgeTiming', sa.Integer(), nullable=True), + sa.Column('ansVolume', sa.Integer(), nullable=True), + sa.Column('tapHoldVolume', sa.Integer(), nullable=True), + sa.Column('criticalSe', sa.Integer(), nullable=True), + sa.Column('breakSe', sa.Integer(), nullable=True), + sa.Column('breakVolume', sa.Integer(), nullable=True), + sa.Column('exSe', sa.Integer(), nullable=True), + sa.Column('exVolume', sa.Integer(), nullable=True), + sa.Column('slideSe', sa.Integer(), nullable=True), + sa.Column('slideVolume', sa.Integer(), nullable=True), + sa.Column('breakSlideVolume', sa.Integer(), nullable=True), + sa.Column('touchVolume', sa.Integer(), nullable=True), + sa.Column('touchHoldVolume', sa.Integer(), nullable=True), + sa.Column('damageSeVolume', sa.Integer(), nullable=True), + sa.Column('headPhoneVolume', sa.Integer(), nullable=True), + sa.Column('sortTab', sa.Integer(), nullable=True), + sa.Column('sortMusic', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='mai2_profile_option_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_profile_rating', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('rating', sa.Integer(), nullable=True), + sa.Column('ratingList', sa.JSON(), nullable=True), + sa.Column('newRatingList', sa.JSON(), nullable=True), + sa.Column('nextRatingList', sa.JSON(), nullable=True), + sa.Column('nextNewRatingList', sa.JSON(), nullable=True), + sa.Column('udemae', sa.JSON(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='mai2_profile_rating_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_profile_region', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('regionId', sa.Integer(), nullable=True), + sa.Column('playCount', sa.Integer(), server_default='1', nullable=True), + sa.Column('created', sa.String(length=25), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'regionId', name='mai2_profile_region_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_score_best', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('musicId', sa.Integer(), nullable=True), + sa.Column('level', sa.Integer(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.Column('achievement', sa.Integer(), nullable=True), + sa.Column('comboStatus', sa.Integer(), nullable=True), + sa.Column('syncStatus', sa.Integer(), nullable=True), + sa.Column('deluxscoreMax', sa.Integer(), nullable=True), + sa.Column('scoreRank', sa.Integer(), nullable=True), + sa.Column('extNum1', sa.Integer(), server_default='0', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'musicId', 'level', name='mai2_score_best_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('mai2_score_course', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('courseId', sa.Integer(), nullable=True), + sa.Column('isLastClear', sa.Boolean(), nullable=True), + sa.Column('totalRestlife', sa.Integer(), nullable=True), + sa.Column('totalAchievement', sa.Integer(), nullable=True), + sa.Column('totalDeluxscore', sa.Integer(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.Column('clearDate', sa.String(length=25), nullable=True), + sa.Column('lastPlayDate', sa.String(length=25), nullable=True), + sa.Column('bestAchievement', sa.Integer(), nullable=True), + sa.Column('bestAchievementDate', sa.String(length=25), nullable=True), + sa.Column('bestDeluxscore', sa.Integer(), nullable=True), + sa.Column('bestDeluxscoreDate', sa.String(length=25), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'courseId', name='mai2_score_best_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('maimai_playlog', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('orderId', sa.Integer(), nullable=True), + sa.Column('sortNumber', sa.Integer(), nullable=True), + sa.Column('placeId', sa.Integer(), nullable=True), + sa.Column('placeName', sa.String(length=255), nullable=True), + sa.Column('country', sa.String(length=255), nullable=True), + sa.Column('regionId', sa.Integer(), nullable=True), + sa.Column('playDate', sa.String(length=255), nullable=True), + sa.Column('userPlayDate', sa.String(length=255), nullable=True), + sa.Column('musicId', sa.Integer(), nullable=True), + sa.Column('level', sa.Integer(), nullable=True), + sa.Column('gameMode', sa.Integer(), nullable=True), + sa.Column('rivalNum', sa.Integer(), nullable=True), + sa.Column('track', sa.Integer(), nullable=True), + sa.Column('eventId', sa.Integer(), nullable=True), + sa.Column('isFreeToPlay', sa.Boolean(), nullable=True), + sa.Column('playerRating', sa.Integer(), nullable=True), + sa.Column('playedUserId1', sa.Integer(), nullable=True), + sa.Column('playedUserId2', sa.Integer(), nullable=True), + sa.Column('playedUserId3', sa.Integer(), nullable=True), + sa.Column('playedUserName1', sa.String(length=255), nullable=True), + sa.Column('playedUserName2', sa.String(length=255), nullable=True), + sa.Column('playedUserName3', sa.String(length=255), nullable=True), + sa.Column('playedMusicLevel1', sa.Integer(), nullable=True), + sa.Column('playedMusicLevel2', sa.Integer(), nullable=True), + sa.Column('playedMusicLevel3', sa.Integer(), nullable=True), + sa.Column('achievement', sa.Integer(), nullable=True), + sa.Column('score', sa.Integer(), nullable=True), + sa.Column('tapScore', sa.Integer(), nullable=True), + sa.Column('holdScore', sa.Integer(), nullable=True), + sa.Column('slideScore', sa.Integer(), nullable=True), + sa.Column('breakScore', sa.Integer(), nullable=True), + sa.Column('syncRate', sa.Integer(), nullable=True), + sa.Column('vsWin', sa.Integer(), nullable=True), + sa.Column('isAllPerfect', sa.Boolean(), nullable=True), + sa.Column('fullCombo', sa.Integer(), nullable=True), + sa.Column('maxFever', sa.Integer(), nullable=True), + sa.Column('maxCombo', sa.Integer(), nullable=True), + sa.Column('tapPerfect', sa.Integer(), nullable=True), + sa.Column('tapGreat', sa.Integer(), nullable=True), + sa.Column('tapGood', sa.Integer(), nullable=True), + sa.Column('tapBad', sa.Integer(), nullable=True), + sa.Column('holdPerfect', sa.Integer(), nullable=True), + sa.Column('holdGreat', sa.Integer(), nullable=True), + sa.Column('holdGood', sa.Integer(), nullable=True), + sa.Column('holdBad', sa.Integer(), nullable=True), + sa.Column('slidePerfect', sa.Integer(), nullable=True), + sa.Column('slideGreat', sa.Integer(), nullable=True), + sa.Column('slideGood', sa.Integer(), nullable=True), + sa.Column('slideBad', sa.Integer(), nullable=True), + sa.Column('breakPerfect', sa.Integer(), nullable=True), + sa.Column('breakGreat', sa.Integer(), nullable=True), + sa.Column('breakGood', sa.Integer(), nullable=True), + sa.Column('breakBad', sa.Integer(), nullable=True), + sa.Column('judgeStyle', sa.Integer(), nullable=True), + sa.Column('isTrackSkip', sa.Boolean(), nullable=True), + sa.Column('isHighScore', sa.Boolean(), nullable=True), + sa.Column('isChallengeTrack', sa.Boolean(), nullable=True), + sa.Column('challengeLife', sa.Integer(), nullable=True), + sa.Column('challengeRemain', sa.Integer(), nullable=True), + sa.Column('isAllPerfectPlus', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('maimai_profile_boss', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('pandoraFlagList0', sa.Integer(), nullable=True), + sa.Column('pandoraFlagList1', sa.Integer(), nullable=True), + sa.Column('pandoraFlagList2', sa.Integer(), nullable=True), + sa.Column('pandoraFlagList3', sa.Integer(), nullable=True), + sa.Column('pandoraFlagList4', sa.Integer(), nullable=True), + sa.Column('pandoraFlagList5', sa.Integer(), nullable=True), + sa.Column('pandoraFlagList6', sa.Integer(), nullable=True), + sa.Column('emblemFlagList', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', name='mai2_profile_boss_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('maimai_profile_detail', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('lastDataVersion', sa.Integer(), nullable=True), + sa.Column('userName', sa.String(length=8), nullable=True), + sa.Column('point', sa.Integer(), nullable=True), + sa.Column('totalPoint', sa.Integer(), nullable=True), + sa.Column('iconId', sa.Integer(), nullable=True), + sa.Column('nameplateId', sa.Integer(), nullable=True), + sa.Column('frameId', sa.Integer(), nullable=True), + sa.Column('trophyId', sa.Integer(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.Column('playVsCount', sa.Integer(), nullable=True), + sa.Column('playSyncCount', sa.Integer(), nullable=True), + sa.Column('winCount', sa.Integer(), nullable=True), + sa.Column('helpCount', sa.Integer(), nullable=True), + sa.Column('comboCount', sa.Integer(), nullable=True), + sa.Column('feverCount', sa.Integer(), nullable=True), + sa.Column('totalHiScore', sa.Integer(), nullable=True), + sa.Column('totalEasyHighScore', sa.Integer(), nullable=True), + sa.Column('totalBasicHighScore', sa.Integer(), nullable=True), + sa.Column('totalAdvancedHighScore', sa.Integer(), nullable=True), + sa.Column('totalExpertHighScore', sa.Integer(), nullable=True), + sa.Column('totalMasterHighScore', sa.Integer(), nullable=True), + sa.Column('totalReMasterHighScore', sa.Integer(), nullable=True), + sa.Column('totalHighSync', sa.Integer(), nullable=True), + sa.Column('totalEasySync', sa.Integer(), nullable=True), + sa.Column('totalBasicSync', sa.Integer(), nullable=True), + sa.Column('totalAdvancedSync', sa.Integer(), nullable=True), + sa.Column('totalExpertSync', sa.Integer(), nullable=True), + sa.Column('totalMasterSync', sa.Integer(), nullable=True), + sa.Column('totalReMasterSync', sa.Integer(), nullable=True), + sa.Column('playerRating', sa.Integer(), nullable=True), + sa.Column('highestRating', sa.Integer(), nullable=True), + sa.Column('rankAuthTailId', sa.Integer(), nullable=True), + sa.Column('eventWatchedDate', sa.String(length=255), nullable=True), + sa.Column('webLimitDate', sa.String(length=255), nullable=True), + sa.Column('challengeTrackPhase', sa.Integer(), nullable=True), + sa.Column('firstPlayBits', sa.Integer(), nullable=True), + sa.Column('lastPlayDate', sa.String(length=255), nullable=True), + sa.Column('lastPlaceId', sa.Integer(), nullable=True), + sa.Column('lastPlaceName', sa.String(length=255), nullable=True), + sa.Column('lastRegionId', sa.Integer(), nullable=True), + sa.Column('lastRegionName', sa.String(length=255), nullable=True), + sa.Column('lastClientId', sa.String(length=255), nullable=True), + sa.Column('lastCountryCode', sa.String(length=255), nullable=True), + sa.Column('eventPoint', sa.Integer(), nullable=True), + sa.Column('totalLv', sa.Integer(), nullable=True), + sa.Column('lastLoginBonusDay', sa.Integer(), nullable=True), + sa.Column('lastSurvivalBonusDay', sa.Integer(), nullable=True), + sa.Column('loginBonusLv', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='maimai_profile_detail_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('maimai_profile_grade_status', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('gradeVersion', sa.Integer(), nullable=True), + sa.Column('gradeLevel', sa.Integer(), nullable=True), + sa.Column('gradeSubLevel', sa.Integer(), nullable=True), + sa.Column('gradeMaxId', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'gradeVersion', name='maimai_profile_grade_status_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('maimai_profile_option', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('soudEffect', sa.Integer(), nullable=True), + sa.Column('mirrorMode', sa.Integer(), nullable=True), + sa.Column('guideSpeed', sa.Integer(), nullable=True), + sa.Column('bgInfo', sa.Integer(), nullable=True), + sa.Column('brightness', sa.Integer(), nullable=True), + sa.Column('isStarRot', sa.Integer(), nullable=True), + sa.Column('breakSe', sa.Integer(), nullable=True), + sa.Column('slideSe', sa.Integer(), nullable=True), + sa.Column('hardJudge', sa.Integer(), nullable=True), + sa.Column('isTagJump', sa.Integer(), nullable=True), + sa.Column('breakSeVol', sa.Integer(), nullable=True), + sa.Column('slideSeVol', sa.Integer(), nullable=True), + sa.Column('isUpperDisp', sa.Integer(), nullable=True), + sa.Column('trackSkip', sa.Integer(), nullable=True), + sa.Column('optionMode', sa.Integer(), nullable=True), + sa.Column('simpleOptionParam', sa.Integer(), nullable=True), + sa.Column('adjustTiming', sa.Integer(), nullable=True), + sa.Column('dispTiming', sa.Integer(), nullable=True), + sa.Column('timingPos', sa.Integer(), nullable=True), + sa.Column('ansVol', sa.Integer(), nullable=True), + sa.Column('noteVol', sa.Integer(), nullable=True), + sa.Column('dmgVol', sa.Integer(), nullable=True), + sa.Column('appealFlame', sa.Integer(), nullable=True), + sa.Column('isFeverDisp', sa.Integer(), nullable=True), + sa.Column('dispJudge', sa.Integer(), nullable=True), + sa.Column('judgePos', sa.Integer(), nullable=True), + sa.Column('ratingGuard', sa.Integer(), nullable=True), + sa.Column('selectChara', sa.Integer(), nullable=True), + sa.Column('sortType', sa.Integer(), nullable=True), + sa.Column('filterGenre', sa.Integer(), nullable=True), + sa.Column('filterLevel', sa.Integer(), nullable=True), + sa.Column('filterRank', sa.Integer(), nullable=True), + sa.Column('filterVersion', sa.Integer(), nullable=True), + sa.Column('filterRec', sa.Integer(), nullable=True), + sa.Column('filterFullCombo', sa.Integer(), nullable=True), + sa.Column('filterAllPerfect', sa.Integer(), nullable=True), + sa.Column('filterDifficulty', sa.Integer(), nullable=True), + sa.Column('filterFullSync', sa.Integer(), nullable=True), + sa.Column('filterReMaster', sa.Integer(), nullable=True), + sa.Column('filterMaxFever', sa.Integer(), nullable=True), + sa.Column('finalSelectId', sa.Integer(), nullable=True), + sa.Column('finalSelectCategory', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='maimai_profile_option_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('maimai_profile_recent_rating', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('userRecentRatingList', sa.JSON(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', name='mai2_profile_recent_rating_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('maimai_profile_web_option', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('isNetMember', sa.Boolean(), nullable=True), + sa.Column('dispRate', sa.Integer(), nullable=True), + sa.Column('dispJudgeStyle', sa.Integer(), nullable=True), + sa.Column('dispRank', sa.Integer(), nullable=True), + sa.Column('dispHomeRanker', sa.Integer(), nullable=True), + sa.Column('dispTotalLv', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='maimai_profile_web_option_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('maimai_score_best', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('musicId', sa.Integer(), nullable=True), + sa.Column('level', sa.Integer(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.Column('achievement', sa.Integer(), nullable=True), + sa.Column('scoreMax', sa.Integer(), nullable=True), + sa.Column('syncRateMax', sa.Integer(), nullable=True), + sa.Column('isAllPerfect', sa.Boolean(), nullable=True), + sa.Column('isAllPerfectPlus', sa.Integer(), nullable=True), + sa.Column('fullCombo', sa.Integer(), nullable=True), + sa.Column('maxFever', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'musicId', 'level', name='maimai_score_best_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_gp_log', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('usedCredit', sa.Integer(), nullable=True), + sa.Column('placeName', sa.String(length=255), nullable=True), + sa.Column('trxnDate', sa.String(length=255), nullable=True), + sa.Column('placeId', sa.Integer(), nullable=True), + sa.Column('kind', sa.Integer(), nullable=True), + sa.Column('pattern', sa.Integer(), nullable=True), + sa.Column('currentGP', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_profile_activity', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('kind', sa.Integer(), nullable=True), + sa.Column('activityId', sa.Integer(), nullable=True), + sa.Column('sortNumber', sa.Integer(), nullable=True), + sa.Column('param1', sa.Integer(), nullable=True), + sa.Column('param2', sa.Integer(), nullable=True), + sa.Column('param3', sa.Integer(), nullable=True), + sa.Column('param4', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'kind', 'activityId', name='ongeki_profile_activity_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_profile_data', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('userName', sa.String(length=8), nullable=True), + sa.Column('level', sa.Integer(), nullable=True), + sa.Column('reincarnationNum', sa.Integer(), nullable=True), + sa.Column('exp', sa.Integer(), nullable=True), + sa.Column('point', sa.Integer(), nullable=True), + sa.Column('totalPoint', sa.Integer(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.Column('jewelCount', sa.Integer(), nullable=True), + sa.Column('totalJewelCount', sa.Integer(), nullable=True), + sa.Column('medalCount', sa.Integer(), nullable=True), + sa.Column('playerRating', sa.Integer(), nullable=True), + sa.Column('highestRating', sa.Integer(), nullable=True), + sa.Column('battlePoint', sa.Integer(), nullable=True), + sa.Column('nameplateId', sa.Integer(), nullable=True), + sa.Column('trophyId', sa.Integer(), nullable=True), + sa.Column('cardId', sa.Integer(), nullable=True), + sa.Column('characterId', sa.Integer(), nullable=True), + sa.Column('characterVoiceNo', sa.Integer(), nullable=True), + sa.Column('tabSetting', sa.Integer(), nullable=True), + sa.Column('tabSortSetting', sa.Integer(), nullable=True), + sa.Column('cardCategorySetting', sa.Integer(), nullable=True), + sa.Column('cardSortSetting', sa.Integer(), nullable=True), + sa.Column('playedTutorialBit', sa.Integer(), nullable=True), + sa.Column('firstTutorialCancelNum', sa.Integer(), nullable=True), + sa.Column('sumTechHighScore', sa.BigInteger(), nullable=True), + sa.Column('sumTechBasicHighScore', sa.BigInteger(), nullable=True), + sa.Column('sumTechAdvancedHighScore', sa.BigInteger(), nullable=True), + sa.Column('sumTechExpertHighScore', sa.BigInteger(), nullable=True), + sa.Column('sumTechMasterHighScore', sa.BigInteger(), nullable=True), + sa.Column('sumTechLunaticHighScore', sa.BigInteger(), nullable=True), + sa.Column('sumBattleHighScore', sa.BigInteger(), nullable=True), + sa.Column('sumBattleBasicHighScore', sa.BigInteger(), nullable=True), + sa.Column('sumBattleAdvancedHighScore', sa.BigInteger(), nullable=True), + sa.Column('sumBattleExpertHighScore', sa.BigInteger(), nullable=True), + sa.Column('sumBattleMasterHighScore', sa.BigInteger(), nullable=True), + sa.Column('sumBattleLunaticHighScore', sa.BigInteger(), nullable=True), + sa.Column('eventWatchedDate', sa.String(length=255), nullable=True), + sa.Column('cmEventWatchedDate', sa.String(length=255), nullable=True), + sa.Column('firstGameId', sa.String(length=8), nullable=True), + sa.Column('firstRomVersion', sa.String(length=8), nullable=True), + sa.Column('firstDataVersion', sa.String(length=8), nullable=True), + sa.Column('firstPlayDate', sa.String(length=255), nullable=True), + sa.Column('lastGameId', sa.String(length=8), nullable=True), + sa.Column('lastRomVersion', sa.String(length=8), nullable=True), + sa.Column('lastDataVersion', sa.String(length=8), nullable=True), + sa.Column('compatibleCmVersion', sa.String(length=8), nullable=True), + sa.Column('lastPlayDate', sa.String(length=255), nullable=True), + sa.Column('lastPlaceId', sa.Integer(), nullable=True), + sa.Column('lastPlaceName', sa.String(length=255), nullable=True), + sa.Column('lastRegionId', sa.Integer(), nullable=True), + sa.Column('lastRegionName', sa.String(length=255), nullable=True), + sa.Column('lastAllNetId', sa.Integer(), nullable=True), + sa.Column('lastClientId', sa.String(length=16), nullable=True), + sa.Column('lastUsedDeckId', sa.Integer(), nullable=True), + sa.Column('lastPlayMusicLevel', sa.Integer(), nullable=True), + sa.Column('banStatus', sa.Integer(), server_default='0', nullable=True), + sa.Column('rivalScoreCategorySetting', sa.Integer(), server_default='0', nullable=True), + sa.Column('overDamageBattlePoint', sa.Integer(), server_default='0', nullable=True), + sa.Column('bestBattlePoint', sa.Integer(), server_default='0', nullable=True), + sa.Column('lastEmoneyBrand', sa.Integer(), server_default='0', nullable=True), + sa.Column('lastEmoneyCredit', sa.Integer(), server_default='0', nullable=True), + sa.Column('isDialogWatchedSuggestMemory', sa.Boolean(), server_default='0', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'version', name='ongeki_profile_profile_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_profile_kop', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('authKey', sa.Integer(), nullable=True), + sa.Column('kopId', sa.Integer(), nullable=True), + sa.Column('areaId', sa.Integer(), nullable=True), + sa.Column('totalTechScore', sa.Integer(), nullable=True), + sa.Column('totalPlatinumScore', sa.Integer(), nullable=True), + sa.Column('techRecordDate', sa.String(length=25), nullable=True), + sa.Column('isTotalTechNewRecord', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'kopId', name='ongeki_profile_kop_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_profile_option', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('optionSet', sa.Integer(), nullable=True), + sa.Column('speed', sa.Integer(), nullable=True), + sa.Column('mirror', sa.Integer(), nullable=True), + sa.Column('judgeTiming', sa.Integer(), nullable=True), + sa.Column('judgeAdjustment', sa.Integer(), nullable=True), + sa.Column('abort', sa.Integer(), nullable=True), + sa.Column('tapSound', sa.Integer(), nullable=True), + sa.Column('volGuide', sa.Integer(), nullable=True), + sa.Column('volAll', sa.Integer(), nullable=True), + sa.Column('volTap', sa.Integer(), nullable=True), + sa.Column('volCrTap', sa.Integer(), nullable=True), + sa.Column('volHold', sa.Integer(), nullable=True), + sa.Column('volSide', sa.Integer(), nullable=True), + sa.Column('volFlick', sa.Integer(), nullable=True), + sa.Column('volBell', sa.Integer(), nullable=True), + sa.Column('volEnemy', sa.Integer(), nullable=True), + sa.Column('volSkill', sa.Integer(), nullable=True), + sa.Column('volDamage', sa.Integer(), nullable=True), + sa.Column('colorField', sa.Integer(), nullable=True), + sa.Column('colorLaneBright', sa.Integer(), nullable=True), + sa.Column('colorLane', sa.Integer(), nullable=True), + sa.Column('colorSide', sa.Integer(), nullable=True), + sa.Column('effectDamage', sa.Integer(), nullable=True), + sa.Column('effectPos', sa.Integer(), nullable=True), + sa.Column('judgeDisp', sa.Integer(), nullable=True), + sa.Column('judgePos', sa.Integer(), nullable=True), + sa.Column('judgeBreak', sa.Integer(), nullable=True), + sa.Column('judgeHit', sa.Integer(), nullable=True), + sa.Column('platinumBreakDisp', sa.Integer(), nullable=True), + sa.Column('judgeCriticalBreak', sa.Integer(), nullable=True), + sa.Column('matching', sa.Integer(), nullable=True), + sa.Column('dispPlayerLv', sa.Integer(), nullable=True), + sa.Column('dispRating', sa.Integer(), nullable=True), + sa.Column('dispBP', sa.Integer(), nullable=True), + sa.Column('headphone', sa.Integer(), nullable=True), + sa.Column('stealthField', sa.Integer(), nullable=True), + sa.Column('colorWallBright', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', name='ongeki_profile_option_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_profile_rating_log', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('highestRating', sa.Integer(), nullable=True), + sa.Column('dataVersion', sa.String(length=10), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'dataVersion', name='ongeki_profile_rating_log_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_profile_recent_rating', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('recentRating', sa.JSON(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', name='ongeki_profile_recent_rating_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_profile_region', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('regionId', sa.Integer(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.Column('created', sa.String(length=25), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'regionId', name='ongeki_profile_region_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_profile_rival', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('rivalUserId', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['rivalUserId'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'rivalUserId', name='ongeki_profile_rival_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_profile_training_room', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('roomId', sa.Integer(), nullable=True), + sa.Column('authKey', sa.Integer(), nullable=True), + sa.Column('cardId', sa.Integer(), nullable=True), + sa.Column('valueDate', sa.String(length=25), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'roomId', name='ongeki_profile_training_room_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_score_best', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('musicId', sa.Integer(), nullable=False), + sa.Column('level', sa.Integer(), nullable=False), + sa.Column('playCount', sa.Integer(), nullable=False), + sa.Column('techScoreMax', sa.Integer(), nullable=False), + sa.Column('techScoreRank', sa.Integer(), nullable=False), + sa.Column('battleScoreMax', sa.Integer(), nullable=False), + sa.Column('battleScoreRank', sa.Integer(), nullable=False), + sa.Column('maxComboCount', sa.Integer(), nullable=False), + sa.Column('maxOverKill', sa.Float(), nullable=False), + sa.Column('maxTeamOverKill', sa.Float(), nullable=False), + sa.Column('isFullBell', sa.Boolean(), nullable=False), + sa.Column('isFullCombo', sa.Boolean(), nullable=False), + sa.Column('isAllBreake', sa.Boolean(), nullable=False), + sa.Column('isLock', sa.Boolean(), nullable=False), + sa.Column('clearStatus', sa.Boolean(), nullable=False), + sa.Column('isStoryWatched', sa.Boolean(), nullable=False), + sa.Column('platinumScoreMax', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'musicId', 'level', name='ongeki_best_score_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_score_playlog', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('sortNumber', sa.Integer(), nullable=True), + sa.Column('placeId', sa.Integer(), nullable=True), + sa.Column('placeName', sa.String(length=255), nullable=True), + sa.Column('playDate', sa.TIMESTAMP(), nullable=True), + sa.Column('userPlayDate', sa.TIMESTAMP(), nullable=True), + sa.Column('musicId', sa.Integer(), nullable=True), + sa.Column('level', sa.Integer(), nullable=True), + sa.Column('playKind', sa.Integer(), nullable=True), + sa.Column('eventId', sa.Integer(), nullable=True), + sa.Column('eventName', sa.String(length=255), nullable=True), + sa.Column('eventPoint', sa.Integer(), nullable=True), + sa.Column('playedUserId1', sa.Integer(), nullable=True), + sa.Column('playedUserId2', sa.Integer(), nullable=True), + sa.Column('playedUserId3', sa.Integer(), nullable=True), + sa.Column('playedUserName1', sa.String(length=8), nullable=True), + sa.Column('playedUserName2', sa.String(length=8), nullable=True), + sa.Column('playedUserName3', sa.String(length=8), nullable=True), + sa.Column('playedMusicLevel1', sa.Integer(), nullable=True), + sa.Column('playedMusicLevel2', sa.Integer(), nullable=True), + sa.Column('playedMusicLevel3', sa.Integer(), nullable=True), + sa.Column('cardId1', sa.Integer(), nullable=True), + sa.Column('cardId2', sa.Integer(), nullable=True), + sa.Column('cardId3', sa.Integer(), nullable=True), + sa.Column('cardLevel1', sa.Integer(), nullable=True), + sa.Column('cardLevel2', sa.Integer(), nullable=True), + sa.Column('cardLevel3', sa.Integer(), nullable=True), + sa.Column('cardAttack1', sa.Integer(), nullable=True), + sa.Column('cardAttack2', sa.Integer(), nullable=True), + sa.Column('cardAttack3', sa.Integer(), nullable=True), + sa.Column('bossCharaId', sa.Integer(), nullable=True), + sa.Column('bossLevel', sa.Integer(), nullable=True), + sa.Column('bossAttribute', sa.Integer(), nullable=True), + sa.Column('clearStatus', sa.Integer(), nullable=True), + sa.Column('techScore', sa.Integer(), nullable=True), + sa.Column('techScoreRank', sa.Integer(), nullable=True), + sa.Column('battleScore', sa.Integer(), nullable=True), + sa.Column('battleScoreRank', sa.Integer(), nullable=True), + sa.Column('maxCombo', sa.Integer(), nullable=True), + sa.Column('judgeMiss', sa.Integer(), nullable=True), + sa.Column('judgeHit', sa.Integer(), nullable=True), + sa.Column('judgeBreak', sa.Integer(), nullable=True), + sa.Column('judgeCriticalBreak', sa.Integer(), nullable=True), + sa.Column('rateTap', sa.Integer(), nullable=True), + sa.Column('rateHold', sa.Integer(), nullable=True), + sa.Column('rateFlick', sa.Integer(), nullable=True), + sa.Column('rateSideTap', sa.Integer(), nullable=True), + sa.Column('rateSideHold', sa.Integer(), nullable=True), + sa.Column('bellCount', sa.Integer(), nullable=True), + sa.Column('totalBellCount', sa.Integer(), nullable=True), + sa.Column('damageCount', sa.Integer(), nullable=True), + sa.Column('overDamage', sa.Integer(), nullable=True), + sa.Column('isTechNewRecord', sa.Boolean(), nullable=True), + sa.Column('isBattleNewRecord', sa.Boolean(), nullable=True), + sa.Column('isOverDamageNewRecord', sa.Boolean(), nullable=True), + sa.Column('isFullCombo', sa.Boolean(), nullable=True), + sa.Column('isFullBell', sa.Boolean(), nullable=True), + sa.Column('isAllBreak', sa.Boolean(), nullable=True), + sa.Column('playerRating', sa.Integer(), nullable=True), + sa.Column('battlePoint', sa.Integer(), nullable=True), + sa.Column('platinumScore', sa.Integer(), nullable=True), + sa.Column('platinumScoreMax', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_score_tech_count', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('levelId', sa.Integer(), nullable=False), + sa.Column('allBreakCount', sa.Integer(), nullable=True), + sa.Column('allBreakPlusCount', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'levelId', name='ongeki_tech_count_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_session_log', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('sortNumber', sa.Integer(), nullable=True), + sa.Column('placeId', sa.Integer(), nullable=True), + sa.Column('playDate', sa.String(length=10), nullable=True), + sa.Column('userPlayDate', sa.String(length=25), nullable=True), + sa.Column('isPaid', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_tech_event_ranking', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('date', sa.String(length=25), nullable=True), + sa.Column('eventId', sa.Integer(), nullable=False), + sa.Column('rank', sa.Integer(), nullable=True), + sa.Column('totalPlatinumScore', sa.Integer(), nullable=False), + sa.Column('totalTechScore', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'eventId', name='ongeki_tech_event_ranking_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_boss', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('musicId', sa.Integer(), nullable=True), + sa.Column('damage', sa.Integer(), nullable=True), + sa.Column('isClear', sa.Boolean(), nullable=True), + sa.Column('eventId', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'musicId', 'eventId', name='ongeki_user_boss_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_card', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('cardId', sa.Integer(), nullable=True), + sa.Column('digitalStock', sa.Integer(), nullable=True), + sa.Column('analogStock', sa.Integer(), nullable=True), + sa.Column('level', sa.Integer(), nullable=True), + sa.Column('maxLevel', sa.Integer(), nullable=True), + sa.Column('exp', sa.Integer(), nullable=True), + sa.Column('printCount', sa.Integer(), nullable=True), + sa.Column('useCount', sa.Integer(), nullable=True), + sa.Column('isNew', sa.Boolean(), nullable=True), + sa.Column('kaikaDate', sa.String(length=25), nullable=True), + sa.Column('choKaikaDate', sa.String(length=25), nullable=True), + sa.Column('skillId', sa.Integer(), nullable=True), + sa.Column('isAcquired', sa.Boolean(), nullable=True), + sa.Column('created', sa.String(length=25), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'cardId', name='ongeki_user_card_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_chapter', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('chapterId', sa.Integer(), nullable=True), + sa.Column('jewelCount', sa.Integer(), nullable=True), + sa.Column('isStoryWatched', sa.Boolean(), nullable=True), + sa.Column('isClear', sa.Boolean(), nullable=True), + sa.Column('lastPlayMusicId', sa.Integer(), nullable=True), + sa.Column('lastPlayMusicCategory', sa.Integer(), nullable=True), + sa.Column('lastPlayMusicLevel', sa.Integer(), nullable=True), + sa.Column('skipTiming1', sa.Integer(), nullable=True), + sa.Column('skipTiming2', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'chapterId', name='ongeki_user_chapter_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_character', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('characterId', sa.Integer(), nullable=True), + sa.Column('costumeId', sa.Integer(), nullable=True), + sa.Column('attachmentId', sa.Integer(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.Column('intimateLevel', sa.Integer(), nullable=True), + sa.Column('intimateCount', sa.Integer(), nullable=True), + sa.Column('intimateCountRewarded', sa.Integer(), nullable=True), + sa.Column('intimateCountDate', sa.String(length=25), nullable=True), + sa.Column('isNew', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'characterId', name='ongeki_user_character_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_deck', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('deckId', sa.Integer(), nullable=True), + sa.Column('cardId1', sa.Integer(), nullable=True), + sa.Column('cardId2', sa.Integer(), nullable=True), + sa.Column('cardId3', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'deckId', name='ongeki_user_deck_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_event_music', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('eventId', sa.Integer(), nullable=True), + sa.Column('type', sa.Integer(), nullable=True), + sa.Column('musicId', sa.Integer(), nullable=True), + sa.Column('level', sa.Integer(), nullable=True), + sa.Column('techScoreMax', sa.Integer(), nullable=True), + sa.Column('platinumScoreMax', sa.Integer(), nullable=True), + sa.Column('techRecordDate', sa.String(length=25), nullable=True), + sa.Column('isTechNewRecord', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'eventId', 'type', 'musicId', 'level', name='ongeki_user_event_music'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_event_point', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('eventId', sa.Integer(), nullable=False), + sa.Column('point', sa.Integer(), nullable=False), + sa.Column('rank', sa.Integer(), nullable=True), + sa.Column('type', sa.Integer(), nullable=False), + sa.Column('date', sa.String(length=25), nullable=True), + sa.Column('isRankingRewarded', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'eventId', name='ongeki_user_event_point_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_gacha', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('gachaId', sa.Integer(), nullable=False), + sa.Column('totalGachaCnt', sa.Integer(), server_default='0', nullable=True), + sa.Column('ceilingGachaCnt', sa.Integer(), server_default='0', nullable=True), + sa.Column('selectPoint', sa.Integer(), server_default='0', nullable=True), + sa.Column('useSelectPoint', sa.Integer(), server_default='0', nullable=True), + sa.Column('dailyGachaCnt', sa.Integer(), server_default='0', nullable=True), + sa.Column('fiveGachaCnt', sa.Integer(), server_default='0', nullable=True), + sa.Column('elevenGachaCnt', sa.Integer(), server_default='0', nullable=True), + sa.Column('dailyGachaDate', sa.TIMESTAMP(), server_default=func.now(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'gachaId', name='ongeki_user_gacha_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_gacha_supply', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('cardId', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'cardId', name='ongeki_user_gacha_supply_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_item', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('itemKind', sa.Integer(), nullable=True), + sa.Column('itemId', sa.Integer(), nullable=True), + sa.Column('stock', sa.Integer(), nullable=True), + sa.Column('isValid', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'itemKind', 'itemId', name='ongeki_user_item_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_login_bonus', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('bonusId', sa.Integer(), nullable=True), + sa.Column('bonusCount', sa.Integer(), nullable=True), + sa.Column('lastUpdateDate', sa.String(length=25), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'bonusId', name='ongeki_user_login_bonus_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_memorychapter', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('chapterId', sa.Integer(), nullable=True), + sa.Column('gaugeId', sa.Integer(), nullable=True), + sa.Column('gaugeNum', sa.Integer(), nullable=True), + sa.Column('jewelCount', sa.Integer(), nullable=True), + sa.Column('isStoryWatched', sa.Boolean(), nullable=True), + sa.Column('isBossWatched', sa.Boolean(), nullable=True), + sa.Column('isDialogWatched', sa.Boolean(), nullable=True), + sa.Column('isEndingWatched', sa.Boolean(), nullable=True), + sa.Column('isClear', sa.Boolean(), nullable=True), + sa.Column('lastPlayMusicId', sa.Integer(), nullable=True), + sa.Column('lastPlayMusicLevel', sa.Integer(), nullable=True), + sa.Column('lastPlayMusicCategory', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'chapterId', name='ongeki_user_memorychapter_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_mission_point', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('version', sa.Integer(), nullable=True), + sa.Column('eventId', sa.Integer(), nullable=True), + sa.Column('point', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'eventId', name='ongeki_user_mission_point_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_music_item', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('musicId', sa.Integer(), nullable=True), + sa.Column('status', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'musicId', name='ongeki_user_music_item_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_print_detail', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('cardId', sa.Integer(), nullable=False), + sa.Column('cardType', sa.Integer(), server_default='0', nullable=True), + sa.Column('printDate', sa.TIMESTAMP(), nullable=False), + sa.Column('serialId', sa.String(length=20), nullable=False), + sa.Column('placeId', sa.Integer(), nullable=False), + sa.Column('clientId', sa.String(length=11), nullable=False), + sa.Column('printerSerialId', sa.String(length=20), nullable=False), + sa.Column('isHolograph', sa.Boolean(), server_default='0', nullable=True), + sa.Column('isAutographed', sa.Boolean(), server_default='0', nullable=True), + sa.Column('printOption1', sa.Boolean(), server_default='1', nullable=True), + sa.Column('printOption2', sa.Boolean(), server_default='1', nullable=True), + sa.Column('printOption3', sa.Boolean(), server_default='1', nullable=True), + sa.Column('printOption4', sa.Boolean(), server_default='1', nullable=True), + sa.Column('printOption5', sa.Boolean(), server_default='1', nullable=True), + sa.Column('printOption6', sa.Boolean(), server_default='1', nullable=True), + sa.Column('printOption7', sa.Boolean(), server_default='1', nullable=True), + sa.Column('printOption8', sa.Boolean(), server_default='1', nullable=True), + sa.Column('printOption9', sa.Boolean(), server_default='1', nullable=True), + sa.Column('printOption10', sa.Boolean(), server_default='0', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('serialId', name='ongeki_user_print_detail_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_scenerio', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('scenarioId', sa.Integer(), nullable=True), + sa.Column('playCount', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'scenarioId', name='ongeki_user_scenerio_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_story', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('storyId', sa.Integer(), nullable=True), + sa.Column('jewelCount', sa.Integer(), nullable=True), + sa.Column('lastChapterId', sa.Integer(), nullable=True), + sa.Column('lastPlayMusicId', sa.Integer(), nullable=True), + sa.Column('lastPlayMusicCategory', sa.Integer(), nullable=True), + sa.Column('lastPlayMusicLevel', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'storyId', name='ongeki_user_story_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_tech_event', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('version', sa.Integer(), nullable=False), + sa.Column('eventId', sa.Integer(), nullable=False), + sa.Column('totalTechScore', sa.Integer(), nullable=False), + sa.Column('totalPlatinumScore', sa.Integer(), nullable=False), + sa.Column('techRecordDate', sa.String(length=25), nullable=True), + sa.Column('isRankingRewarded', sa.Boolean(), nullable=True), + sa.Column('isTotalTechNewRecord', sa.Boolean(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'eventId', name='ongeki_user_tech_event_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('ongeki_user_trade_item', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('chapterId', sa.Integer(), nullable=True), + sa.Column('tradeItemId', sa.Integer(), nullable=True), + sa.Column('tradeCount', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'chapterId', 'tradeItemId', name='ongeki_user_trade_item_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('pokken_item', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('category', sa.Integer(), nullable=True), + sa.Column('content', sa.Integer(), nullable=True), + sa.Column('type', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user'), + sa.UniqueConstraint('user', 'category', 'content', 'type', name='pokken_item_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('pokken_match_data', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('num_games', sa.Integer(), nullable=True), + sa.Column('play_modes', sa.JSON(), nullable=True), + sa.Column('results', sa.JSON(), nullable=True), + sa.Column('ex_ko_num', sa.Integer(), nullable=True), + sa.Column('wko_num', sa.Integer(), nullable=True), + sa.Column('timeup_win_num', sa.Integer(), nullable=True), + sa.Column('cool_ko_num', sa.Integer(), nullable=True), + sa.Column('perfect_ko_num', sa.Integer(), nullable=True), + sa.Column('use_navi', sa.Integer(), nullable=True), + sa.Column('use_navi_cloth', sa.Integer(), nullable=True), + sa.Column('use_aid_skill', sa.Integer(), nullable=True), + sa.Column('play_date', sa.TIMESTAMP(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('pokken_pokemon_data', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('char_id', sa.Integer(), nullable=False), + sa.Column('illustration_book_no', sa.Integer(), nullable=True), + sa.Column('pokemon_exp', sa.Integer(), nullable=True), + sa.Column('battle_num_vs_wan', sa.Integer(), nullable=True), + sa.Column('win_vs_wan', sa.Integer(), nullable=True), + sa.Column('battle_num_vs_lan', sa.Integer(), nullable=True), + sa.Column('win_vs_lan', sa.Integer(), nullable=True), + sa.Column('battle_num_vs_cpu', sa.Integer(), nullable=True), + sa.Column('win_cpu', sa.Integer(), nullable=True), + sa.Column('battle_all_num_tutorial', sa.Integer(), nullable=True), + sa.Column('battle_num_tutorial', sa.Integer(), nullable=True), + sa.Column('bp_point_atk', sa.Integer(), nullable=True), + sa.Column('bp_point_res', sa.Integer(), nullable=True), + sa.Column('bp_point_def', sa.Integer(), nullable=True), + sa.Column('bp_point_sp', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'char_id', name='pokken_pokemon_data_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('pokken_profile', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('trainer_name', sa.String(length=16), nullable=True), + sa.Column('home_region_code', sa.Integer(), nullable=True), + sa.Column('home_loc_name', sa.String(length=255), nullable=True), + sa.Column('pref_code', sa.Integer(), nullable=True), + sa.Column('navi_newbie_flag', sa.Boolean(), nullable=True), + sa.Column('navi_enable_flag', sa.Boolean(), nullable=True), + sa.Column('pad_vibrate_flag', sa.Boolean(), nullable=True), + sa.Column('trainer_rank_point', sa.Integer(), nullable=True), + sa.Column('wallet', sa.Integer(), nullable=True), + sa.Column('fight_money', sa.Integer(), nullable=True), + sa.Column('score_point', sa.Integer(), nullable=True), + sa.Column('grade_max_num', sa.Integer(), nullable=True), + sa.Column('extra_counter', sa.Integer(), nullable=True), + sa.Column('tutorial_progress_flag', sa.JSON(), nullable=True), + sa.Column('total_play_days', sa.Integer(), nullable=True), + sa.Column('play_date_time', sa.Integer(), nullable=True), + sa.Column('achievement_flag', sa.JSON(), nullable=True), + sa.Column('lucky_box_fail_num', sa.Integer(), nullable=True), + sa.Column('event_reward_get_flag', sa.Integer(), nullable=True), + sa.Column('rank_pvp_all', sa.Integer(), nullable=True), + sa.Column('rank_pvp_loc', sa.Integer(), nullable=True), + sa.Column('rank_cpu_all', sa.Integer(), nullable=True), + sa.Column('rank_cpu_loc', sa.Integer(), nullable=True), + sa.Column('rank_event', sa.Integer(), nullable=True), + sa.Column('awake_num', sa.Integer(), nullable=True), + sa.Column('use_support_num', sa.Integer(), nullable=True), + sa.Column('rankmatch_flag', sa.Integer(), nullable=True), + sa.Column('rankmatch_max', sa.Integer(), nullable=True), + sa.Column('rankmatch_progress', sa.JSON(), nullable=True), + sa.Column('rankmatch_success', sa.Integer(), nullable=True), + sa.Column('beat_num', sa.Integer(), nullable=True), + sa.Column('title_text_id', sa.Integer(), nullable=True), + sa.Column('title_plate_id', sa.Integer(), nullable=True), + sa.Column('title_decoration_id', sa.Integer(), nullable=True), + sa.Column('support_pokemon_list', sa.JSON(), nullable=True), + sa.Column('support_set_1_1', sa.Integer(), nullable=True), + sa.Column('support_set_1_2', sa.Integer(), nullable=True), + sa.Column('support_set_2_1', sa.Integer(), nullable=True), + sa.Column('support_set_2_2', sa.Integer(), nullable=True), + sa.Column('support_set_3_1', sa.Integer(), nullable=True), + sa.Column('support_set_3_2', sa.Integer(), nullable=True), + sa.Column('navi_trainer', sa.Integer(), nullable=True), + sa.Column('navi_version_id', sa.Integer(), nullable=True), + sa.Column('aid_skill_list', sa.JSON(), nullable=True), + sa.Column('aid_skill', sa.Integer(), nullable=True), + sa.Column('comment_text_id', sa.Integer(), nullable=True), + sa.Column('comment_word_id', sa.Integer(), nullable=True), + sa.Column('latest_use_pokemon', sa.Integer(), nullable=True), + sa.Column('ex_ko_num', sa.Integer(), nullable=True), + sa.Column('wko_num', sa.Integer(), nullable=True), + sa.Column('timeup_win_num', sa.Integer(), nullable=True), + sa.Column('cool_ko_num', sa.Integer(), nullable=True), + sa.Column('perfect_ko_num', sa.Integer(), nullable=True), + sa.Column('record_flag', sa.Integer(), nullable=True), + sa.Column('continue_num', sa.Integer(), nullable=True), + sa.Column('avatar_body', sa.Integer(), nullable=True), + sa.Column('avatar_gender', sa.Integer(), nullable=True), + sa.Column('avatar_background', sa.Integer(), nullable=True), + sa.Column('avatar_head', sa.Integer(), nullable=True), + sa.Column('avatar_battleglass', sa.Integer(), nullable=True), + sa.Column('avatar_face0', sa.Integer(), nullable=True), + sa.Column('avatar_face1', sa.Integer(), nullable=True), + sa.Column('avatar_face2', sa.Integer(), nullable=True), + sa.Column('avatar_bodyall', sa.Integer(), nullable=True), + sa.Column('avatar_wear', sa.Integer(), nullable=True), + sa.Column('avatar_accessory', sa.Integer(), nullable=True), + sa.Column('avatar_stamp', sa.Integer(), nullable=True), + sa.Column('event_state', sa.Integer(), nullable=True), + sa.Column('event_id', sa.Integer(), nullable=True), + sa.Column('sp_bonus_category_id_1', sa.Integer(), nullable=True), + sa.Column('sp_bonus_key_value_1', sa.Integer(), nullable=True), + sa.Column('sp_bonus_category_id_2', sa.Integer(), nullable=True), + sa.Column('sp_bonus_key_value_2', sa.Integer(), nullable=True), + sa.Column('last_play_event_id', sa.Integer(), nullable=True), + sa.Column('event_achievement_flag', sa.JSON(), nullable=True), + sa.Column('event_achievement_param', sa.JSON(), nullable=True), + sa.Column('battle_num_vs_wan', sa.Integer(), nullable=True), + sa.Column('win_vs_wan', sa.Integer(), nullable=True), + sa.Column('battle_num_vs_lan', sa.Integer(), nullable=True), + sa.Column('win_vs_lan', sa.Integer(), nullable=True), + sa.Column('battle_num_vs_cpu', sa.Integer(), nullable=True), + sa.Column('win_cpu', sa.Integer(), nullable=True), + sa.Column('battle_num_tutorial', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_end_sessions', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('quest_id', sa.Integer(), nullable=False), + sa.Column('play_result_flag', sa.Boolean(), nullable=False), + sa.Column('reward_data', sa.JSON(), nullable=True), + sa.Column('play_date', sa.TIMESTAMP(), server_default=func.now(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_equipment_data', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('equipment_id', sa.Integer(), nullable=False), + sa.Column('enhancement_value', sa.Integer(), nullable=False), + sa.Column('enhancement_exp', sa.Integer(), nullable=False), + sa.Column('awakening_exp', sa.Integer(), nullable=False), + sa.Column('awakening_stage', sa.Integer(), nullable=False), + sa.Column('possible_awakening_flag', sa.Integer(), nullable=False), + sa.Column('get_date', sa.TIMESTAMP(), server_default=func.now(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'equipment_id', name='sao_equipment_data_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_hero_log_data', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('user_hero_log_id', sa.Integer(), nullable=False), + sa.Column('log_level', sa.Integer(), nullable=False), + sa.Column('log_exp', sa.Integer(), nullable=False), + sa.Column('main_weapon', sa.Integer(), nullable=False), + sa.Column('sub_equipment', sa.Integer(), nullable=False), + sa.Column('skill_slot1_skill_id', sa.Integer(), nullable=False), + sa.Column('skill_slot2_skill_id', sa.Integer(), nullable=False), + sa.Column('skill_slot3_skill_id', sa.Integer(), nullable=False), + sa.Column('skill_slot4_skill_id', sa.Integer(), nullable=False), + sa.Column('skill_slot5_skill_id', sa.Integer(), nullable=False), + sa.Column('get_date', sa.TIMESTAMP(), server_default=func.now(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'user_hero_log_id', name='sao_hero_log_data_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_hero_party', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('user_party_team_id', sa.Integer(), nullable=False), + sa.Column('user_hero_log_id_1', sa.Integer(), nullable=False), + sa.Column('user_hero_log_id_2', sa.Integer(), nullable=False), + sa.Column('user_hero_log_id_3', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'user_party_team_id', name='sao_hero_party_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_item_data', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('item_id', sa.Integer(), nullable=False), + sa.Column('get_date', sa.TIMESTAMP(), server_default=func.now(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'item_id', name='sao_item_data_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_play_sessions', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('user_party_team_id', sa.Integer(), nullable=False), + sa.Column('episode_id', sa.Integer(), nullable=False), + sa.Column('play_mode', sa.Integer(), nullable=False), + sa.Column('quest_drop_boost_apply_flag', sa.Integer(), nullable=False), + sa.Column('play_date', sa.TIMESTAMP(), server_default=func.now(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'user_party_team_id', 'play_date', name='sao_play_sessions_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_player_quest', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('episode_id', sa.Integer(), nullable=False), + sa.Column('quest_clear_flag', sa.Boolean(), nullable=False), + sa.Column('clear_time', sa.Integer(), nullable=False), + sa.Column('combo_num', sa.Integer(), nullable=False), + sa.Column('total_damage', sa.Integer(), nullable=False), + sa.Column('concurrent_destroying_num', sa.Integer(), nullable=False), + sa.Column('play_date', sa.TIMESTAMP(), server_default=func.now(), nullable=False), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user', 'episode_id', name='sao_player_quest_uk'), + mysql_charset='utf8mb4' + ) + op.create_table('sao_profile', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('user_type', sa.Integer(), server_default='1', nullable=True), + sa.Column('nick_name', sa.String(length=16), server_default='PLAYER', nullable=True), + sa.Column('rank_num', sa.Integer(), server_default='1', nullable=True), + sa.Column('rank_exp', sa.Integer(), server_default='0', nullable=True), + sa.Column('own_col', sa.Integer(), server_default='0', nullable=True), + sa.Column('own_vp', sa.Integer(), server_default='0', nullable=True), + sa.Column('own_yui_medal', sa.Integer(), server_default='0', nullable=True), + sa.Column('setting_title_id', sa.Integer(), server_default='20005', nullable=True), + sa.ForeignKeyConstraint(['user'], ['aime_user.id'], onupdate='cascade', ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('sao_profile') + op.drop_table('sao_player_quest') + op.drop_table('sao_play_sessions') + op.drop_table('sao_item_data') + op.drop_table('sao_hero_party') + op.drop_table('sao_hero_log_data') + op.drop_table('sao_equipment_data') + op.drop_table('sao_end_sessions') + op.drop_table('pokken_profile') + op.drop_table('pokken_pokemon_data') + op.drop_table('pokken_match_data') + op.drop_table('pokken_item') + op.drop_table('ongeki_user_trade_item') + op.drop_table('ongeki_user_tech_event') + op.drop_table('ongeki_user_story') + op.drop_table('ongeki_user_scenerio') + op.drop_table('ongeki_user_print_detail') + op.drop_table('ongeki_user_music_item') + op.drop_table('ongeki_user_mission_point') + op.drop_table('ongeki_user_memorychapter') + op.drop_table('ongeki_user_login_bonus') + op.drop_table('ongeki_user_item') + op.drop_table('ongeki_user_gacha_supply') + op.drop_table('ongeki_user_gacha') + op.drop_table('ongeki_user_event_point') + op.drop_table('ongeki_user_event_music') + op.drop_table('ongeki_user_deck') + op.drop_table('ongeki_user_character') + op.drop_table('ongeki_user_chapter') + op.drop_table('ongeki_user_card') + op.drop_table('ongeki_user_boss') + op.drop_table('ongeki_tech_event_ranking') + op.drop_table('ongeki_session_log') + op.drop_table('ongeki_score_tech_count') + op.drop_table('ongeki_score_playlog') + op.drop_table('ongeki_score_best') + op.drop_table('ongeki_profile_training_room') + op.drop_table('ongeki_profile_rival') + op.drop_table('ongeki_profile_region') + op.drop_table('ongeki_profile_recent_rating') + op.drop_table('ongeki_profile_rating_log') + op.drop_table('ongeki_profile_option') + op.drop_table('ongeki_profile_kop') + op.drop_table('ongeki_profile_data') + op.drop_table('ongeki_profile_activity') + op.drop_table('ongeki_gp_log') + op.drop_table('maimai_score_best') + op.drop_table('maimai_profile_web_option') + op.drop_table('maimai_profile_recent_rating') + op.drop_table('maimai_profile_option') + op.drop_table('maimai_profile_grade_status') + op.drop_table('maimai_profile_detail') + op.drop_table('maimai_profile_boss') + op.drop_table('maimai_playlog') + op.drop_table('mai2_score_course') + op.drop_table('mai2_score_best') + op.drop_table('mai2_profile_region') + op.drop_table('mai2_profile_rating') + op.drop_table('mai2_profile_option') + op.drop_table('mai2_profile_ghost') + op.drop_table('mai2_profile_extend') + op.drop_table('mai2_profile_detail') + op.drop_table('mai2_profile_consec_logins') + op.drop_table('mai2_profile_activity') + op.drop_table('mai2_playlog') + op.drop_table('mai2_item_print_detail') + op.drop_table('mai2_item_map') + op.drop_table('mai2_item_login_bonus') + op.drop_table('mai2_item_item') + op.drop_table('mai2_item_friend_season_ranking') + op.drop_table('mai2_item_favorite') + op.drop_table('mai2_item_charge') + op.drop_table('mai2_item_character') + op.drop_table('mai2_item_card') + op.drop_table('machine') + op.drop_table('idac_user_vs_info') + op.drop_table('idac_user_timetrial_event') + op.drop_table('idac_user_time_trial') + op.drop_table('idac_user_ticket') + op.drop_table('idac_user_theory_running') + op.drop_table('idac_user_theory_partner') + op.drop_table('idac_user_theory_course') + op.drop_table('idac_user_story_episode_difficulty') + op.drop_table('idac_user_story_episode') + op.drop_table('idac_user_story') + op.drop_table('idac_user_stamp') + op.drop_table('idac_user_course') + op.drop_table('idac_user_challenge') + op.drop_table('idac_user_car') + op.drop_table('idac_profile_theory') + op.drop_table('idac_profile_stock') + op.drop_table('idac_profile_rank') + op.drop_table('idac_profile_config') + op.drop_table('idac_profile_avatar') + op.drop_table('idac_profile') + op.drop_table('diva_score') + op.drop_table('diva_profile_shop') + op.drop_table('diva_profile_pv_customize') + op.drop_table('diva_profile_module') + op.drop_table('diva_profile_customize_item') + op.drop_table('diva_profile') + op.drop_table('diva_playlog') + op.drop_table('cxb_score') + op.drop_table('cxb_rev_energy') + op.drop_table('cxb_ranking') + op.drop_table('cxb_profile') + op.drop_table('cxb_playlog') + op.drop_table('chuni_static_login_bonus') + op.drop_table('chuni_score_playlog') + op.drop_table('chuni_score_course') + op.drop_table('chuni_score_best') + op.drop_table('chuni_profile_region') + op.drop_table('chuni_profile_recent_rating') + op.drop_table('chuni_profile_overpower') + op.drop_table('chuni_profile_option_ex') + op.drop_table('chuni_profile_option') + op.drop_table('chuni_profile_emoney') + op.drop_table('chuni_profile_data_ex') + op.drop_table('chuni_profile_data') + op.drop_table('chuni_profile_charge') + op.drop_table('chuni_profile_activity') + op.drop_table('chuni_item_print_state') + op.drop_table('chuni_item_print_detail') + op.drop_table('chuni_item_matching') + op.drop_table('chuni_item_map_area') + op.drop_table('chuni_item_map') + op.drop_table('chuni_item_login_bonus') + op.drop_table('chuni_item_item') + op.drop_table('chuni_item_gacha') + op.drop_table('chuni_item_favorite') + op.drop_table('chuni_item_duel') + op.drop_table('chuni_item_character') + op.drop_table('arcade_owner') + op.drop_table('aime_card') + op.drop_table('schema_versions') + op.drop_table('sao_static_title_list') + op.drop_table('sao_static_support_log_list') + op.drop_table('sao_static_rare_drop_list') + op.drop_table('sao_static_quest') + op.drop_table('sao_static_item_list') + op.drop_table('sao_static_hero_list') + op.drop_table('sao_static_equipment_list') + op.drop_table('ongeki_static_tech_music') + op.drop_table('ongeki_static_rewards') + op.drop_table('ongeki_static_present_list') + op.drop_table('ongeki_static_music_ranking_list') + op.drop_table('ongeki_static_music') + op.drop_table('ongeki_static_game_point') + op.drop_table('ongeki_static_gachas') + op.drop_table('ongeki_static_gacha_cards') + op.drop_table('ongeki_static_events') + op.drop_table('ongeki_static_client_testmode') + op.drop_table('ongeki_static_cards') + op.drop_table('mai2_static_ticket') + op.drop_table('mai2_static_music') + op.drop_table('mai2_static_event') + op.drop_table('mai2_static_cards') + op.drop_table('event_log') + op.drop_table('diva_static_shop') + op.drop_table('diva_static_quests') + op.drop_table('diva_static_music') + op.drop_table('diva_static_items') + op.drop_table('cxb_static_music') + op.drop_table('chuni_static_music') + op.drop_table('chuni_static_login_bonus_preset') + op.drop_table('chuni_static_gachas') + op.drop_table('chuni_static_gacha_cards') + op.drop_table('chuni_static_events') + op.drop_table('chuni_static_charge') + op.drop_table('chuni_static_cards') + op.drop_table('chuni_static_avatar') + op.drop_table('chuni_profile_team') + op.drop_table('arcade') + op.drop_table('aime_user') + # ### end Alembic commands ### diff --git a/core/config.py b/core/config.py index 68db052..8c349c1 100644 --- a/core/config.py +++ b/core/config.py @@ -159,7 +159,7 @@ class DatabaseConfig: @property def protocol(self) -> str: return CoreConfig.get_config_field( - self.__config, "core", "database", "type", default="mysql" + self.__config, "core", "database", "protocol", default="mysql" ) @property @@ -186,6 +186,13 @@ class DatabaseConfig: default=10000, ) + @property + def sqlite_db_filename(self) -> str: + return CoreConfig.get_config_field( + self.__config, "core", "database", "sqlite_db_filename", default="aime.db" + ) + + @property def enable_memcached(self) -> bool: return CoreConfig.get_config_field( diff --git a/core/data/database.py b/core/data/database.py index e39d864..c835019 100644 --- a/core/data/database.py +++ b/core/data/database.py @@ -1,5 +1,8 @@ import logging, coloredlogs from typing import Optional, Dict, List + +import alembic +from alembic.config import Config from sqlalchemy.orm import scoped_session, sessionmaker from sqlalchemy.exc import SQLAlchemyError from sqlalchemy import create_engine @@ -9,11 +12,22 @@ import secrets, string import bcrypt from hashlib import sha256 -from core.config import CoreConfig +from core.config import CoreConfig, DatabaseConfig from core.data.schema import * from core.utils import Utils +def build_db_url_from_config(database: DatabaseConfig): + if database.protocol == "sqlite": + return f"{database.protocol}:///{database.sqlite_db_filename}" + + if database.sha2_password: + passwd = sha256(database.password.encode()).digest() + return f"{database.protocol}://{database.username}:{passwd.hex()}@{database.host}:{database.port}/{database.name}?charset=utf8mb4" + else: + return f"{database.protocol}://{database.username}:{database.password}@{database.host}:{database.port}/{database.name}?charset=utf8mb4" + + class Data: current_schema_version = 6 engine = None @@ -24,12 +38,8 @@ class Data: base = None def __init__(self, cfg: CoreConfig) -> None: self.config = cfg - - if self.config.database.sha2_password: - passwd = sha256(self.config.database.password.encode()).digest() - self.__url = f"{self.config.database.protocol}://{self.config.database.username}:{passwd.hex()}@{self.config.database.host}:{self.config.database.port}/{self.config.database.name}?charset=utf8mb4" - else: - self.__url = f"{self.config.database.protocol}://{self.config.database.username}:{self.config.database.password}@{self.config.database.host}:{self.config.database.port}/{self.config.database.name}?charset=utf8mb4" + + self.__url = build_db_url_from_config(self.config.database) if Data.engine is None: Data.engine = create_engine(self.__url, pool_recycle=3600) @@ -355,3 +365,10 @@ class Data: all_game_versions = self.base.get_all_schema_vers() for ver in all_game_versions: self.logger.info(f"{ver['game']} -> v{ver['version']}") + + def alembic_upgrade(self, alembic_ini_path: str): + from alembic import command + alembic_cfg = alembic.config.Config(alembic_ini_path) + alembic_cfg.set_main_option('artemis_db_url', build_db_url_from_config(self.config.database)) + command.upgrade(alembic_cfg, 'head') + diff --git a/core/data/schema/arcade.py b/core/data/schema/arcade.py index 2fb8e43..01dbc83 100644 --- a/core/data/schema/arcade.py +++ b/core/data/schema/arcade.py @@ -2,8 +2,7 @@ from typing import Optional, Dict, List from sqlalchemy import Table, Column, and_, or_ from sqlalchemy.sql.schema import ForeignKey, PrimaryKeyConstraint from sqlalchemy.types import Integer, String, Boolean, JSON -from sqlalchemy.sql import func, select -from sqlalchemy.dialects.mysql import insert +from sqlalchemy.sql import func, select, insert from sqlalchemy.engine import Row import re diff --git a/core/data/schema/base.py b/core/data/schema/base.py index ef980e5..cf7a5c3 100644 --- a/core/data/schema/base.py +++ b/core/data/schema/base.py @@ -1,15 +1,17 @@ import json import logging +import sqlite3 from random import randrange from typing import Any, Optional, Dict, List -from sqlalchemy.engine import Row + +import sqlalchemy.dialects.mysql +from sqlalchemy.engine import Row, CursorResult from sqlalchemy.engine.cursor import CursorResult from sqlalchemy.engine.base import Connection -from sqlalchemy.sql import text, func, select -from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.sql import text, func, select, insert +from sqlalchemy.exc import SQLAlchemyError, IntegrityError from sqlalchemy import MetaData, Table, Column from sqlalchemy.types import Integer, String, TIMESTAMP, JSON -from sqlalchemy.dialects.mysql import insert from core.config import CoreConfig @@ -102,12 +104,60 @@ class BaseData: return None return row["version"] - - def touch_schema_ver(self, ver: int, game: str = "CORE") -> Optional[int]: - sql = insert(schema_ver).values(game=game, version=ver) - conflict = sql.on_duplicate_key_update(version=schema_ver.c.version) - result = self.execute(conflict) + def upsert(self, table: Table, data: Dict) -> CursorResult | None: + # fall back to the old behavior for mysql, and use current behavior for postgres + + sql = self.dialect_insert(table).values(data) + unique_columns = get_unique_columns(table) + if len(unique_columns) > 0: + if self.conn.bind.name == "mysql": + conflict = sql.on_duplicate_key_update(**data) + elif self.conn.bind.name == "postgresql": + conflict = sql.on_conflict_do_update( + index_elements=unique_columns, + set_=data, + ) + + if self.conn.bind.name == "sqlite": + from sqlalchemy import exc + try: + result = self.conn.execute(sql) + except (exc.IntegrityError, sqlite3.IntegrityError) as e: + # run update query using the values from unique_columns + from operator import and_ + conditions = [getattr(table.c, col) == data[col] for col in unique_columns] + + if len(conditions) > 1: + from functools import reduce + where_clause = reduce(and_, conditions) + elif conditions: + where_clause = conditions[0] + + upd = table.update().where(where_clause).values(data) + self.logger.error(f"SQL post-conflict update ({', '.join(unique_columns)}): {str(upd)}") + result = self.execute(upd) + else: + result = self.execute(conflict) + else: + result = self.execute(sql) + if result is None: + self.logger.error(f"Failed to upsert data into {table.name}") + return None + return result + + def dialect_insert(self, table: Table): + if self.conn.bind.name == "mysql": + return sqlalchemy.dialects.mysql.insert(table) + elif self.conn.bind.name == "postgresql": + return sqlalchemy.dialects.postgresql.insert(table) + elif self.conn.bind.name == "sqlite": + return sqlalchemy.dialects.sqlite.insert(table) + else: + raise Exception("Unknown dialect") + + def touch_schema_ver(self, ver: int, game: str = "CORE") -> Optional[int]: + result = self.upsert(schema_ver, dict(game=game, version=ver)) if result is None: self.logger.error( f"Failed to update schema version for game {game} (v{ver})" @@ -116,10 +166,7 @@ class BaseData: return result.lastrowid def set_schema_ver(self, ver: int, game: str = "CORE") -> Optional[int]: - sql = insert(schema_ver).values(game=game, version=ver) - conflict = sql.on_duplicate_key_update(version=ver) - - result = self.execute(conflict) + result = self.upsert(schema_ver, dict(game=game, version=ver)) if result is None: self.logger.error( f"Failed to update schema version for game {game} (v{ver})" @@ -165,3 +212,25 @@ class BaseData: data[k] = False return data + + +unique_columns_cache = {} + +def get_unique_columns(table: Table): + global unique_columns_cache + + # Check if the unique columns for this table are already cached + if table.name in unique_columns_cache: + return unique_columns_cache[table.name] + + # Calculate the unique columns for this table + unique_columns = [] + from sqlalchemy import UniqueConstraint, PrimaryKeyConstraint + has_unique_constraint = any(isinstance(constraint, UniqueConstraint) for constraint in table.constraints) + for constraint in table.constraints: + # if we do not have a unique constraint, use the primary key + if (not has_unique_constraint and isinstance(constraint, PrimaryKeyConstraint)) or isinstance(constraint, UniqueConstraint): + unique_columns.extend([column.name for column in constraint.columns]) + unique_columns_cache[table.name] = unique_columns + print(unique_columns) + return unique_columns \ No newline at end of file diff --git a/core/data/schema/user.py b/core/data/schema/user.py index 221ba81..d540511 100644 --- a/core/data/schema/user.py +++ b/core/data/schema/user.py @@ -2,9 +2,7 @@ from enum import Enum from typing import Optional, List from sqlalchemy import Table, Column from sqlalchemy.types import Integer, String, TIMESTAMP -from sqlalchemy.sql import func -from sqlalchemy.dialects.mysql import insert -from sqlalchemy.sql import func, select +from sqlalchemy.sql import func, select, insert from sqlalchemy.engine import Row import bcrypt @@ -41,26 +39,21 @@ class UserData(BaseData): permission: int = 1, ) -> Optional[int]: if id is None: - sql = insert(aime_user).values( + result = self.upsert(aime_user, dict( username=username, email=email, password=password, permissions=permission, - ) + )) else: - sql = insert(aime_user).values( + result = self.upsert(aime_user, dict( id=id, username=username, email=email, password=password, permissions=permission, - ) + )) - conflict = sql.on_duplicate_key_update( - username=username, email=email, password=password, permissions=permission - ) - - result = self.execute(conflict) if result is None: return None return result.lastrowid diff --git a/dbutils.py b/dbutils.py index 85b18a0..0fbc098 100644 --- a/dbutils.py +++ b/dbutils.py @@ -1,3 +1,5 @@ +import os + import yaml import argparse import logging @@ -88,4 +90,7 @@ if __name__ == "__main__": elif args.action == "version": data.show_versions() + elif args.action == "alembic_upgrade": + data.alembic_upgrade(os.path.join(os.path.dirname(__file__), 'alembic.ini')) + data.logger.info("Done") diff --git a/requirements.txt b/requirements.txt index c399e1f..8edacde 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,3 +19,4 @@ protobuf autobahn pillow pyjwt +alembic==1.13.0 diff --git a/titles/chuni/schema/item.py b/titles/chuni/schema/item.py index dc2751d..ff54c63 100644 --- a/titles/chuni/schema/item.py +++ b/titles/chuni/schema/item.py @@ -10,8 +10,7 @@ from sqlalchemy import ( from sqlalchemy.types import Integer, String, TIMESTAMP, Boolean, JSON from sqlalchemy.engine.base import Connection from sqlalchemy.schema import ForeignKey -from sqlalchemy.sql import func, select -from sqlalchemy.dialects.mysql import insert +from sqlalchemy.sql import func, select, insert from sqlalchemy.engine import Row from core.data.schema import BaseData, metadata @@ -301,20 +300,14 @@ class ChuniItemData(BaseData): rest_sec: int = 60, is_full: bool = False ) -> Optional[int]: - sql = insert(matching).values( + result = self.upsert(matching, dict( roomId=room_id, version=version, restMSec=rest_sec, user=user_id, isFull=is_full, matchingMemberInfoList=matching_member_info_list, - ) - - conflict = sql.on_duplicate_key_update( - restMSec=rest_sec, matchingMemberInfoList=matching_member_info_list - ) - - result = self.execute(conflict) + )) if result is None: return None return result.lastrowid @@ -348,13 +341,12 @@ class ChuniItemData(BaseData): def put_login_bonus( self, user_id: int, version: int, preset_id: int, **login_bonus_data ) -> Optional[int]: - sql = insert(login_bonus).values( - version=version, user=user_id, presetId=preset_id, **login_bonus_data - ) - - conflict = sql.on_duplicate_key_update(presetId=preset_id, **login_bonus_data) - - result = self.execute(conflict) + result = self.upsert(login_bonus, dict( + version=version, + user=user_id, + presetId=preset_id, + **login_bonus_data + )) if result is None: return None return result.lastrowid @@ -396,10 +388,7 @@ class ChuniItemData(BaseData): character_data = self.fix_bools(character_data) - sql = insert(character).values(**character_data) - conflict = sql.on_duplicate_key_update(**character_data) - - result = self.execute(conflict) + result = self.upsert(character, character_data) if result is None: return None return result.lastrowid @@ -427,10 +416,7 @@ class ChuniItemData(BaseData): item_data = self.fix_bools(item_data) - sql = insert(item).values(**item_data) - conflict = sql.on_duplicate_key_update(**item_data) - - result = self.execute(conflict) + result = self.upsert(item, item_data) if result is None: return None return result.lastrowid @@ -453,10 +439,8 @@ class ChuniItemData(BaseData): duel_data = self.fix_bools(duel_data) - sql = insert(duel).values(**duel_data) - conflict = sql.on_duplicate_key_update(**duel_data) + result = self.upsert(duel, duel_data) - result = self.execute(conflict) if result is None: return None return result.lastrowid @@ -474,10 +458,7 @@ class ChuniItemData(BaseData): map_data = self.fix_bools(map_data) - sql = insert(map).values(**map_data) - conflict = sql.on_duplicate_key_update(**map_data) - - result = self.execute(conflict) + result = self.upsert(map, map_data) if result is None: return None return result.lastrowid @@ -495,10 +476,7 @@ class ChuniItemData(BaseData): map_area_data = self.fix_bools(map_area_data) - sql = insert(map_area).values(**map_area_data) - conflict = sql.on_duplicate_key_update(**map_area_data) - - result = self.execute(conflict) + result = self.upsert(map_area, map_area_data) if result is None: return None return result.lastrowid @@ -522,13 +500,7 @@ class ChuniItemData(BaseData): def put_user_gacha( self, aime_id: int, gacha_id: int, gacha_data: Dict ) -> Optional[int]: - sql = insert(gacha).values(user=aime_id, gachaId=gacha_id, **gacha_data) - - conflict = sql.on_duplicate_key_update( - user=aime_id, gachaId=gacha_id, **gacha_data - ) - result = self.execute(conflict) - + result = self.upsert(gacha, dict(user=aime_id, gachaId=gacha_id, **gacha_data)) if result is None: self.logger.warning(f"put_user_gacha: Failed to insert! aime_id: {aime_id}") return None @@ -566,11 +538,7 @@ class ChuniItemData(BaseData): return result.fetchall() def put_user_print_state(self, aime_id: int, **print_data) -> Optional[int]: - sql = insert(print_state).values(user=aime_id, **print_data) - - conflict = sql.on_duplicate_key_update(user=aime_id, **print_data) - result = self.execute(conflict) - + result = self.upsert(print_state, dict(user=aime_id, **print_data)) if result is None: self.logger.warning( f"put_user_print_state: Failed to insert! aime_id: {aime_id}" @@ -581,13 +549,7 @@ class ChuniItemData(BaseData): def put_user_print_detail( self, aime_id: int, serial_id: str, user_print_data: Dict ) -> Optional[int]: - sql = insert(print_detail).values( - user=aime_id, serialId=serial_id, **user_print_data - ) - - conflict = sql.on_duplicate_key_update(user=aime_id, **user_print_data) - result = self.execute(conflict) - + result = self.upsert(print_detail, dict(user=aime_id, serialId=serial_id, **user_print_data)) if result is None: self.logger.warning( f"put_user_print_detail: Failed to insert! aime_id: {aime_id}" diff --git a/titles/chuni/schema/profile.py b/titles/chuni/schema/profile.py index ea70583..eb2c2cd 100644 --- a/titles/chuni/schema/profile.py +++ b/titles/chuni/schema/profile.py @@ -4,8 +4,7 @@ from sqlalchemy.types import Integer, String, TIMESTAMP, Boolean, JSON, BigInteg from sqlalchemy.engine.base import Connection from sqlalchemy.schema import ForeignKey from sqlalchemy.engine import Row -from sqlalchemy.sql import func, select -from sqlalchemy.dialects.mysql import insert +from sqlalchemy.sql import func, select, insert from core.data.schema import BaseData, metadata @@ -405,10 +404,7 @@ class ChuniProfileData(BaseData): profile_data = self.fix_bools(profile_data) - sql = insert(profile).values(**profile_data) - conflict = sql.on_duplicate_key_update(**profile_data) - result = self.execute(conflict) - + result = self.upsert(profile, profile_data) if result is None: self.logger.warning(f"put_profile_data: Failed to update! aime_id: {aime_id}") return None @@ -447,9 +443,7 @@ class ChuniProfileData(BaseData): if "accessCode" in profile_ex_data: profile_ex_data.pop("accessCode") - sql = insert(profile_ex).values(**profile_ex_data) - conflict = sql.on_duplicate_key_update(**profile_ex_data) - result = self.execute(conflict) + result = self.upsert(profile_ex, profile_ex_data) if result is None: self.logger.warning( @@ -474,9 +468,7 @@ class ChuniProfileData(BaseData): def put_profile_option(self, aime_id: int, option_data: Dict) -> Optional[int]: option_data["user"] = aime_id - sql = insert(option).values(**option_data) - conflict = sql.on_duplicate_key_update(**option_data) - result = self.execute(conflict) + result = self.upsert(option, option_data) if result is None: self.logger.warning( @@ -498,9 +490,7 @@ class ChuniProfileData(BaseData): ) -> Optional[int]: option_ex_data["user"] = aime_id - sql = insert(option_ex).values(**option_ex_data) - conflict = sql.on_duplicate_key_update(**option_ex_data) - result = self.execute(conflict) + result = self.upsert(option_ex, option_ex_data) if result is None: self.logger.warning( @@ -520,12 +510,8 @@ class ChuniProfileData(BaseData): def put_profile_recent_rating( self, aime_id: int, recent_rating_data: List[Dict] ) -> Optional[int]: - sql = insert(recent_rating).values( - user=aime_id, recentRating=recent_rating_data - ) - conflict = sql.on_duplicate_key_update(recentRating=recent_rating_data) + result = self.upsert(recent_rating, dict(user=aime_id, recentRating=recent_rating_data)) - result = self.execute(conflict) if result is None: self.logger.warning( f"put_profile_recent_rating: Failed to update! aime_id: {aime_id}" @@ -547,9 +533,7 @@ class ChuniProfileData(BaseData): activity_data["activityId"] = activity_data["id"] activity_data.pop("id") - sql = insert(activity).values(**activity_data) - conflict = sql.on_duplicate_key_update(**activity_data) - result = self.execute(conflict) + result = self.upsert(activity, activity_data) if result is None: self.logger.warning( @@ -573,9 +557,7 @@ class ChuniProfileData(BaseData): def put_profile_charge(self, aime_id: int, charge_data: Dict) -> Optional[int]: charge_data["user"] = aime_id - sql = insert(charge).values(**charge_data) - conflict = sql.on_duplicate_key_update(**charge_data) - result = self.execute(conflict) + result = self.upsert(charge, charge_data) if result is None: self.logger.warning( @@ -601,10 +583,7 @@ class ChuniProfileData(BaseData): def put_profile_emoney(self, aime_id: int, emoney_data: Dict) -> Optional[int]: emoney_data["user"] = aime_id - sql = insert(emoney).values(**emoney_data) - conflict = sql.on_duplicate_key_update(**emoney_data) - - result = self.execute(conflict) + result = self.upsert(emoney, emoney_data) if result is None: return None return result.lastrowid @@ -622,10 +601,7 @@ class ChuniProfileData(BaseData): ) -> Optional[int]: overpower_data["user"] = aime_id - sql = insert(overpower).values(**overpower_data) - conflict = sql.on_duplicate_key_update(**overpower_data) - - result = self.execute(conflict) + result = self.upsert(overpower, overpower_data) if result is None: return None return result.lastrowid @@ -669,10 +645,7 @@ class ChuniProfileData(BaseData): def update_team(self, team_id: int, team_data: Dict) -> bool: team_data["id"] = team_id - sql = insert(team).values(**team_data) - conflict = sql.on_duplicate_key_update(**team_data) - - result = self.execute(conflict) + result = self.upsert(team, team_data) if result is None: self.logger.warn( diff --git a/titles/chuni/schema/score.py b/titles/chuni/schema/score.py index 7e41b8f..250424d 100644 --- a/titles/chuni/schema/score.py +++ b/titles/chuni/schema/score.py @@ -4,8 +4,7 @@ from sqlalchemy.types import Integer, String, TIMESTAMP, Boolean, JSON, BigInteg from sqlalchemy.engine.base import Connection from sqlalchemy.schema import ForeignKey from sqlalchemy.engine import Row -from sqlalchemy.sql import func, select -from sqlalchemy.dialects.mysql import insert +from sqlalchemy.sql import func, select, insert from sqlalchemy.sql.expression import exists from core.data.schema import BaseData, metadata @@ -154,10 +153,7 @@ class ChuniScoreData(BaseData): course_data["user"] = aime_id course_data = self.fix_bools(course_data) - sql = insert(course).values(**course_data) - conflict = sql.on_duplicate_key_update(**course_data) - - result = self.execute(conflict) + result = self.upsert(course, course_data) if result is None: return None return result.lastrowid @@ -174,10 +170,8 @@ class ChuniScoreData(BaseData): score_data["user"] = aime_id score_data = self.fix_bools(score_data) - sql = insert(best_score).values(**score_data) - conflict = sql.on_duplicate_key_update(**score_data) + result = self.upsert(best_score, score_data) - result = self.execute(conflict) if result is None: return None return result.lastrowid @@ -213,10 +207,7 @@ class ChuniScoreData(BaseData): if "romVersion" not in playlog_data: playlog_data["romVersion"] = romVer.get(version, "1.00.0") - sql = insert(playlog).values(**playlog_data) - conflict = sql.on_duplicate_key_update(**playlog_data) - - result = self.execute(conflict) + result = self.upsert(playlog, playlog_data) if result is None: return None return result.lastrowid diff --git a/titles/chuni/schema/static.py b/titles/chuni/schema/static.py index fe32d41..1596982 100644 --- a/titles/chuni/schema/static.py +++ b/titles/chuni/schema/static.py @@ -11,8 +11,7 @@ from sqlalchemy.types import Integer, String, TIMESTAMP, Boolean, JSON, Float from sqlalchemy.engine.base import Connection from sqlalchemy.engine import Row from sqlalchemy.schema import ForeignKey -from sqlalchemy.sql import func, select -from sqlalchemy.dialects.mysql import insert +from sqlalchemy.sql import func, select, insert from datetime import datetime from core.data.schema import BaseData, metadata @@ -187,7 +186,7 @@ class ChuniStaticData(BaseData): need_login_day_count: int, login_bonus_category_type: int, ) -> Optional[int]: - sql = insert(login_bonus).values( + result = self.upsert(login_bonus, dict( version=version, presetId=preset_id, loginBonusId=login_bonus_id, @@ -197,17 +196,7 @@ class ChuniStaticData(BaseData): itemNum=item_num, needLoginDayCount=need_login_day_count, loginBonusCategoryType=login_bonus_category_type, - ) - - conflict = sql.on_duplicate_key_update( - loginBonusName=login_bonus_name, - presentName=present_ame, - itemNum=item_num, - needLoginDayCount=need_login_day_count, - loginBonusCategoryType=login_bonus_category_type, - ) - - result = self.execute(conflict) + )) if result is None: return None return result.lastrowid @@ -248,18 +237,12 @@ class ChuniStaticData(BaseData): def put_login_bonus_preset( self, version: int, preset_id: int, preset_name: str, is_enabled: bool ) -> Optional[int]: - sql = insert(login_bonus_preset).values( + result = self.upsert(login_bonus_preset, dict( presetId=preset_id, version=version, presetName=preset_name, isEnabled=is_enabled, - ) - - conflict = sql.on_duplicate_key_update( - presetName=preset_name, isEnabled=is_enabled - ) - - result = self.execute(conflict) + )) if result is None: return None return result.lastrowid @@ -282,13 +265,7 @@ class ChuniStaticData(BaseData): def put_event( self, version: int, event_id: int, type: int, name: str ) -> Optional[int]: - sql = insert(events).values( - version=version, eventId=event_id, type=type, name=name - ) - - conflict = sql.on_duplicate_key_update(name=name) - - result = self.execute(conflict) + result = self.upsert(events, dict(version=version, eventId=event_id, type=type, name=name)) if result is None: return None return result.lastrowid @@ -355,7 +332,7 @@ class ChuniStaticData(BaseData): jacketPath: str, we_tag: str, ) -> Optional[int]: - sql = insert(music).values( + result = self.upsert(music, dict( version=version, songId=song_id, chartId=chart_id, @@ -365,18 +342,7 @@ class ChuniStaticData(BaseData): genre=genre, jacketPath=jacketPath, worldsEndTag=we_tag, - ) - - conflict = sql.on_duplicate_key_update( - title=title, - artist=artist, - level=level, - genre=genre, - jacketPath=jacketPath, - worldsEndTag=we_tag, - ) - - result = self.execute(conflict) + )) if result is None: return None return result.lastrowid @@ -390,23 +356,14 @@ class ChuniStaticData(BaseData): consume_type: int, selling_appeal: bool, ) -> Optional[int]: - sql = insert(charge).values( + result = self.upsert(charge, dict( version=version, chargeId=charge_id, name=name, expirationDays=expiration_days, consumeType=consume_type, sellingAppeal=selling_appeal, - ) - - conflict = sql.on_duplicate_key_update( - name=name, - expirationDays=expiration_days, - consumeType=consume_type, - sellingAppeal=selling_appeal, - ) - - result = self.execute(conflict) + )) if result is None: return None return result.lastrowid @@ -471,23 +428,14 @@ class ChuniStaticData(BaseData): iconPath: str, texturePath: str, ) -> Optional[int]: - sql = insert(avatar).values( + result = self.upsert(avatar, dict( version=version, avatarAccessoryId=avatarAccessoryId, name=name, category=category, iconPath=iconPath, texturePath=texturePath, - ) - - conflict = sql.on_duplicate_key_update( - name=name, - category=category, - iconPath=iconPath, - texturePath=texturePath, - ) - - result = self.execute(conflict) + )) if result is None: return None return result.lastrowid @@ -499,21 +447,12 @@ class ChuniStaticData(BaseData): gacha_name: int, **gacha_data, ) -> Optional[int]: - sql = insert(gachas).values( + result = self.upsert(gachas, dict( version=version, gachaId=gacha_id, gachaName=gacha_name, **gacha_data, - ) - - conflict = sql.on_duplicate_key_update( - version=version, - gachaId=gacha_id, - gachaName=gacha_name, - **gacha_data, - ) - - result = self.execute(conflict) + )) if result is None: self.logger.warning(f"Failed to insert gacha! gacha_id {gacha_id}") return None @@ -542,13 +481,7 @@ class ChuniStaticData(BaseData): def put_gacha_card( self, gacha_id: int, card_id: int, **gacha_card ) -> Optional[int]: - sql = insert(gacha_cards).values(gachaId=gacha_id, cardId=card_id, **gacha_card) - - conflict = sql.on_duplicate_key_update( - gachaId=gacha_id, cardId=card_id, **gacha_card - ) - - result = self.execute(conflict) + sql = self.upsert(gacha_cards, dict(gachaId=gacha_id, cardId=card_id, **gacha_card)) if result is None: self.logger.warning(f"Failed to insert gacha card! gacha_id {gacha_id}") return None @@ -580,11 +513,11 @@ class ChuniStaticData(BaseData): return result.fetchone() def put_card(self, version: int, card_id: int, **card_data) -> Optional[int]: - sql = insert(cards).values(version=version, cardId=card_id, **card_data) - - conflict = sql.on_duplicate_key_update(**card_data) - - result = self.execute(conflict) + result = self.upsert(cards, dict( + version=version, + cardId=card_id, + **card_data, + )) if result is None: self.logger.warning(f"Failed to insert card! card_id {card_id}") return None