Skip to content

Data Manipulation Language - DML

Introdução

DML é um conjunto de instruções SQL que permitem consultar, adicionar, editar e excluir dados de tabelas ou visualizações de banco de dados

DML

# Create a character.
def add_character(conn, nome: str, elemento: str) -> None:
    with conn.cursor() as cur:
        cur.execute(
            f"""
            SELECT criar_personagem(
                '{nome}',
                '{elemento}'
            )"""
        )
        result = cur.fetchone()
        conn.commit()
        return result[0]


# Delete a item instance from a character inventory.
def delete_item_instance(conn, id: int) -> None:
    with conn.cursor() as cur:
        cur.execute(
            f"""
            DELETE FROM item_instancia
            WHERE id = {id};
            """
        )
        conn.commit()

# Activate an instance of item (potion).
def update_item_instance(conn, id: int, used: bool) -> None:
    with conn.cursor() as cur:
        cur.execute(
            f"""
            UPDATE item_instancia
            SET usado = {used}
            WHERE id = {id};
            """
        )
        conn.commit()

# Update `energia_arcana` after using spell.
def get_update_character_mp(conn, character_id: int, spell_value: int) -> int:
    with conn.cursor() as cur:
        cur.execute(f"""
            UPDATE personagem
            SET energia_arcana = energia_arcana - {spell_value}
            WHERE id = {character_id}
            RETURNING energia_arcana;
        """)
        result = cur.fetchone()
        conn.commit()
        return result[0]

    return None

# function to reset enemies
def reset_enemies(conn, subregiao_id: int) -> None:
    with conn.cursor() as cur:
        cur.execute(
            f"""
            UPDATE
                inimigo_instancia ii
            SET
                vida = i.vida_maxima
            FROM inimigo i
            WHERE ii.inimigo_id = i.id AND ii.sub_regiao_id = {subregiao_id}
            """
        )
        conn.commit()

# function to change subregion
def update_character_subregion(conn, character_id: int, sub_region_id: int) -> int:
    with conn.cursor() as cur:
        cur.execute(
            f"""
            UPDATE personagem
                SET sub_regiao_id = {sub_region_id}
            WHERE personagem.id = {character_id}
            RETURNING sub_regiao_id;
            """
        )
        result = cur.fetchone()[0]
        conn.commit()
        return result

# Update a combat between a caracter and enemies.
def update_combat(conn , enemies: List[Enemy], character: Character) -> None:
    with conn.cursor() as cursor:
        for enemy in enemies:
            cursor.execute(
                f"""
                SELECT atualizar_combate(
                    {character.id},
                    {enemy.id},
                    {int(character.vida)},
                    {int(enemy.vida)}
                );
                """
            )
        conn.commit()

# Add a spell to a character spellbook.
def add_learned_spells(conn, spellbook_id: int, spells_ids: List[int]) -> None:
    with conn.cursor() as cur:
        for spell_id in spells_ids:
            cur.execute(
                f"""
                INSERT INTO feitico_aprendido (grimorio_id, feitico_id)
                VALUES ({spellbook_id}, {spell_id});
                """
            )
        conn.commit()

# Add an instance of item in a backpack.
def add_items_instance(conn, backpack_id: int, item_ids: List[int]) -> None:
    with conn.cursor() as cur:
        for item_id in item_ids:
            cur.execute(
                f"""
                INSERT INTO item_instancia (item_id, mochila_id, usado)
                VALUES ({item_id}, {backpack_id}, FALSE)
                RETURNING item_id;
                """
            )
        conn.commit()


# function to sell an item to merchant
def sell_item(conn, character_id, item_id, preco_venda, merchant_id):
    try:
        cursor = conn.cursor()
        cursor.execute("""
            DELETE FROM item_instancia
            WHERE id = (
                SELECT ii.id
                FROM item_instancia ii
                JOIN mochila m ON ii.mochila_id = m.id
                JOIN inventario inv ON m.id = inv.id
                WHERE inv.personagem_id = %s AND ii.item_id = %s
                LIMIT 1
            )
        """, (character_id, item_id))

        cursor.execute("""
            INSERT INTO transacao (mercador_id, personagem_id, item_id)
            VALUES (%s, %s, %s)
        """, (merchant_id, character_id, item_id))

        cursor.execute("""
            UPDATE personagem
            SET moedas = moedas + %s
            WHERE id = %s
        """, (preco_venda, character_id))

        conn.commit()
        cursor.close()
        return True
    except Exception as e:
        conn.rollback()
        print(f"Erro ao vender item: {e}")
        return False


def buy_item(conn, character_id, item_id, preco):
    try:
        with conn.cursor() as cur:
            cur.execute("SELECT moedas FROM personagem WHERE id = %s", (character_id,))
            moedas = cur.fetchone()[0]
            if moedas < preco:
                raise Exception("Moedas insuficientes")

            cur.execute("""
                UPDATE armazenamento
                SET quantidade = quantidade - 1
                WHERE item_id = %s AND quantidade > 0
                RETURNING id
            """, (item_id,))
            armazenamento_id = cur.fetchone()
            if armazenamento_id is None:
                raise Exception("Item não disponível no armazenamento")

            cur.execute("""
                INSERT INTO item_instancia (item_id, mochila_id)
                VALUES (%s, (SELECT m.id FROM mochila m JOIN inventario i ON m.id = i.id WHERE i.personagem_id = %s))
            """, (item_id, character_id))

            cur.execute("""
                UPDATE personagem
                SET moedas = moedas - %s
                WHERE id = %s
            """, (preco, character_id))

            conn.commit()
    except Exception as e:
        conn.rollback()
        raise e

# function to transfer itens to your inventory
def transfer_item_to_inventory(conn, character_id, item_id, quantidade):
    with conn.cursor() as cur:
        cur.execute(
            """
            UPDATE armazenamento
            SET quantidade = quantidade - %s
            WHERE item_id = %s AND id IN (
                SELECT armazenamento_id 
                FROM sub_regiao 
                WHERE id = (
                    SELECT sub_regiao_id 
                    FROM personagem 
                    WHERE id = %s
                )
            );
            """,
            (quantidade, item_id, character_id)
        )

        cur.execute(
            """
            INSERT INTO item_instancia (item_id, mochila_id)
            SELECT %s, m.id
            FROM mochila m
            JOIN inventario inv ON m.id = inv.id
            WHERE inv.personagem_id = %s;
            """,
            (item_id, character_id)
        )
        conn.commit()

Histórico de Versão

Versão Data Descrição Autor
1.0 13/01/2024 Criação Grupo
1.1 13/01/2024 Atualização Grupo
1.2 03/02/2025 Atualização entrega 3 Grupo
2.0 10/02/2025 Atualização Grupo