tortoise / aerich

A database migrations tool for TortoiseORM, ready to production.
https://github.com/tortoise/aerich
Apache License 2.0
825 stars 93 forks source link

This event loop is already running #59

Closed Andrexxelles closed 3 years ago

Andrexxelles commented 3 years ago

aerich.ini /

[aerich]
tortoise_orm = config.TORTOISE_ORM
location = ./migrations

config.py /

TORTOISE_ORM = {
    "connections": {"default": "sqlite://database.db"},
    "apps": {
        "models": {
            "models": ["test.models", "aerich.models"],
            "default_connection": "default",
        },
    },
}

test.py /

from tortoise import fields, Tortoise
from tortoise.models import Model
from vkbottle import Bot
from vkbottle import Message

bot = Bot("Secret he he he,this my token")

class Chat(Model):
    id = fields.IntField(pk=True)
    uid = fields.IntField(unique=True)

    class Meta:
        table = 'Chats'

class User(Model):
    id = fields.IntField(pk=True)
    chat = fields.ForeignKeyField('models.Chat', to_field='uid')  # chat_id
    uid = fields.IntField()
    warn = fields.IntField(default=0)
    ban = fields.BooleanField(default=0)
    ban_time = fields.IntField(default=0)
    acess = fields.IntField(default=1)

    class Meta:
        table = 'User'
        unique_together = ('chat_id', 'uid')

async def init_db():
    await Tortoise.init(db_url='sqlite://database.db', modules={'models': ['__main__']})
    await Tortoise.generate_schemas()

@bot.on.message_handler(text=['dbc <id>'])
async def wrapper(answer: Message, id):
    if await User.exists(uid=id, chat_id=answer.peer_id):
        return 'такой пользователь,в такой беседе,уже есть!.'
    else:
        await User.create(chat_id=answer.peer_id, uid=id)

@bot.on.message_handler(text=['dbcc'])
async def wrapper(answer: Message):
    if await Chat.exists(uid=answer.peer_id):
        return 'Такой чат уже есть.!'
    else:
        await Chat.create(uid=answer.peer_id)

@bot.on.message_handler(text=['warn <id>'])
async def wrapper(answer: Message, id):
    user = await User.get(chat_id=answer.peer_id, uid=id)
    user.warn += 1
    await user.save()
    if user.warn >= 3:
        await answer(f'kick {id}')
        user.warn -= user.warn
        await user.save()

@bot.on.message_handler(text=['ban <id> <count><type>'])
async def wrapper(answer: Message, id, type):
    user = await User.get(chat_id=answer.peer_id, uid=id)

@bot.on.message_handler(text=['dbs'])
async def wrapper(answer: Message):
    await answer(str(await Chat.all().values('id', 'uid')))
    await answer(str(await User.all().values('id', 'chat_id', 'uid', 'warn', 'ban', 'ban_time')))

@bot.on.message_handler(text=['warn <person>'])
async def wrapper(answer: Message, person=''):
    await answer(str(User.filter(chat_id=answer.peer_id, uid=person)))
    await User.filter(chat_id=answer.peer_id, uid=person).update(warns=1)

@bot.on.message_handler(text=['warns <person>'])
async def wrapper(answer: Message, person=''):
    await answer(str((await User.get(chat_id=answer.peer_id, uid=person)).warn))

bot.run_polling(on_startup=init_db)

error / aerich migrate Traceback (most recent call last): File "c:\users\admin\appdata\local\programs\python\python38-32\lib\runpy.py", line 194, in _run_module_as_main return _run_code(code, main_globals, None, File "c:\users\admin\appdata\local\programs\python\python38-32\lib\runpy.py", line 87, in _run_code exec(code, run_globals) File "C:\Users\admin\AppData\Local\Programs\Python\Python38-32\Scripts\aerich.exe__main.py", line 7, in File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\aerich\cli.py", line 242, in main cli() File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\click\core.py", line 829, in call return self.main(args, kwargs) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\click\core.py", line 782, in main rv = self.invoke(ctx) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\click\core.py", line 1256, in invoke Command.invoke(self, ctx) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\click\core.py", line 1066, in invoke return ctx.invoke(self.callback, ctx.params) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\click\core.py", line 610, in invoke return callback(args, kwargs) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\click\decorators.py", line 21, in new_func return f(get_current_context(), *args, *kwargs) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\aerich\cli.py", line 29, in wrapper return loop.run_until_complete(f(args, kwargs)) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\asyncio\base_events.py", line 616, in run_until_complete return future.result() File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\aerich\cli.py", line 72, in cli await Migrate.init_with_old_models(tortoise_config, app, location) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\aerich\migrate.py", line 66, in init_with_old_models await Tortoise.init(config=migrate_config) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\tortoise__init.py", line 556, in init cls._init_apps(apps_config) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\tortoise__init__.py", line 425, in _init_apps cls.init_models(info["models"], name, _init_relations=False) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\tortoise__init__.py", line 406, in init_models app_models += cls._discover_models(module, app_label) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\tortoise\init.py", line 353, in _discover_models module = importlib.import_module(models_path) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\importlib\init.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "", line 1014, in _gcd_import File "", line 991, in _find_and_load File "", line 961, in _find_and_load_unlocked File "", line 219, in _call_with_frames_removed File "", line 1014, in _gcd_import File "", line 991, in _find_and_load File "", line 975, in _find_and_load_unlocked File "", line 671, in _load_unlocked File "", line 783, in exec_module File "", line 219, in _call_with_frames_removed File ".\test.py", line 6, in bot = Bot("This my token") File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\vkbottle\framework\bot\bot.py", line 112, in init__ self.group_id = group_id or self.get_id_by_token(self.tokens[0]) File "c:\users\admin\appdata\local\programs\python\python38-32\lib\site-packages\vkbottle\framework\bot\bot.py", line 212, in get_id_by_token response = asyncio.get_event_loop().run_until_complete( File "c:\users\admin\appdata\local\programs\python\python38-32\lib\asyncio\base_events.py", line 592, in run_until_complete self._check_running() File "c:\users\admin\appdata\local\programs\python\python38-32\lib\asyncio\base_events.py", line 552, in _check_running raise RuntimeError('This event loop is already running') RuntimeError: This event loop is already running

long2ice commented 3 years ago

separate bot = Bot("Secret he he he,this my token") and tortoise config to two different files.

Andrexxelles commented 3 years ago

I put TORTOISE_ORM in the same file where bot = .... but the error remains ..

long2ice commented 3 years ago

You should ensure don't run code bot = Bot() when exec aerich migrate