Exemplo n.º 1
0
def encode_play():

    # None of this works because all encode uses await, and you cannot call
    # any await method unless every def is async def
    # So we do have to split our database query build + ORM into both sync
    # and async

    from uvicore import db
    import sqlalchemy as sa
    from databases import Database

    connection = 'wiki'

    database = Database('mysql://*****:*****@127.0.0.1:3306/uvicore_wiki')
    database.connect()

    table = sa.Table("users", db.metadata.get(connection),
                     sa.Column("id", sa.Integer, primary_key=True),
                     sa.Column("name", sa.String(length=50)))

    #engine = db.engine('wiki')
    #con = db.connect()
    query = table.select()
    users = database.fetch_all(query)
    # for user in users:

    # table = User.Db.table
    # query = table.select()
    # users = con.execute(query)

    dd('DONE encode_play()')
Exemplo n.º 2
0
class ShowsDB(object):
    def __init__(self):
        self.database = Database(url=DATABASE_URL,
                                 ssl='require',
                                 min_size=1,
                                 max_size=2)
        self.metadata = MetaData()
        self.shows = Table('shows', self.metadata,
                           Column('show_id', Integer, primary_key=True),
                           Column('type', String, nullable=True),
                           Column('title', String, nullable=True),
                           Column('director', String, nullable=True),
                           Column('cast', String, nullable=True),
                           Column('country', String, nullable=True),
                           Column('date_added', Date, nullable=True),
                           Column('release_year', Integer, nullable=True),
                           Column('rating', String, nullable=True),
                           Column('duration', String, nullable=True),
                           Column('listed_in', String, nullable=True),
                           Column('description', String, nullable=True))

    def initialize(self):
        engine = create_engine(DATABASE_URL)
        self.metadata.create_all(engine)
        return self

    def connect(self):
        return self.database.connect()

    def disconnect(self):
        return self.database.disconnect()

    def execute(self, query, get='all'):
        if get != 'all':
            return self.database.fetch_one(query)
        return self.database.fetch_all(query)

    def fetch_all(self, query):
        return self.database.fetch_all(query)
Exemplo n.º 3
0
class SoundBert(commands.Bot):
    def __init__(self, config: Config):
        self._ensure_event_loop()
        super().__init__(command_prefix=SoundBert._get_guild_prefix)

        self.config = config
        self.db = Database(config.database_url)
        self.loop.run_until_complete(self.db.connect())

        base_extensions = [
            'soundbert.cogs.soundboard', 'soundbert.cogs.info',
            'soundbert.cogs.settings', 'soundbert.cogs.admin'
        ]

        log.info('Loading base extensions.')
        for ext in base_extensions:
            self.load_extension(ext)
            log.debug(f'Loaded {ext}')

        log.info('Loading extra extensions.')
        for ext in self.config.extra_extensions.split(','):
            ext = ext.strip()
            try:
                self.load_extension(ext)
            except commands.ExtensionNotFound:
                log.exception(f'Failed to load {ext}.')
            else:
                log.debug(f'Loaded {ext}.')

    def run(self):
        super(SoundBert, self).run(self.config.token)

    @staticmethod
    def _ensure_event_loop():
        """
        Allows for subprocessing using asyncio on Windows, and tries to use uvloop on Unix-like systems.
        """
        if platform.system() == 'Windows':
            loop = asyncio.ProactorEventLoop()
            asyncio.set_event_loop(loop)
        else:
            try:
                import uvloop

                asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
            except ImportError:
                pass

    async def _get_guild_prefix(self, msg: Message):
        """
        Implementation for command_prefix.

        :param msg: The message that might have a command.
        :return: The prefix
        """
        await self._ensure_guild(msg.guild.id)
        prefix = await self.db.fetch_val(
            select([guilds.c.prefix]).where(guilds.c.id == msg.guild.id))
        return commands.when_mentioned_or(prefix)(self, msg)

    @alru_cache(maxsize=2048)
    async def _ensure_guild(self, guild_id: int):
        """
        Ensures that the guild is in the database. Uses an LRU cache to try to not ping the database too much.

        :param guild_id: The guild id
        """
        log.debug(f'Ensuring guild {guild_id} is in database.')
        query = guilds.insert().values(id=guild_id,
                                       prefix=self.config.default_prefix)
        try:
            await self.db.execute(query)
        except UniqueViolationError:
            pass

    async def on_command_error(self, ctx: commands.Context,
                               exception: commands.CommandError):
        """
        Error handling.

        :param ctx: Command context
        :param exception: What went wrong
        """
        log_msg = (
            f'In guild {ctx.guild.name}, channel {ctx.channel.name}, '
            f'{ctx.author.name} executed {ctx.message.content}, but encountered exception: {exception}'
        )
        if isinstance(exception,
                      (commands.UserInputError, commands.CheckFailure,
                       commands.CommandOnCooldown)):
            log.debug(log_msg)
            await warn(ctx)
        else:
            log.exception(log_msg, exc_info=exception)
            await err(ctx)

        if len(exception.args) > 0:
            try:
                delay = int(exception.args[1])
            except (IndexError, ValueError):
                delay = 60
            await ctx.send(exception.args[0], delete_after=delay)

    async def on_command(self, ctx: commands.Context):
        """
        Log command execution.

        :param ctx: Command context
        """
        log.info(f'In guild {ctx.guild.name}, channel {ctx.channel.name}, '
                 f'{ctx.author.name} executed {ctx.message.content}')
Exemplo n.º 4
0
# timing different calls
timer = 0


def timer_start():
    global timer
    timer = time.time()


def timer_end():
    return time.time() - timer


timer_start()
asyncio.run(database.connect())
gprint("Database init took %3.2f" % (timer_end()))

d = []
timer_start()
for submission in reddit.subreddit(config['subreddit']).top(limit=25):
    d.append(submission)
gprint("Feed fetch took %3.2f" % (timer_end()))

wait_cache = []


async def get_waits():
    global wait_cache
    global query_count
Exemplo n.º 5
0
from settings import DATABASE_URL
from databases import Database
import sqlalchemy


metadata = sqlalchemy.MetaData()
db_url = str(DATABASE_URL)
database = Database(db_url)
database.connect()