RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-516932

mrBars1k's questions

Martin Hope
mrBars1k
Asked: 2024-06-07 16:35:39 +0000 UTC

无法异步连接到机器人和数据库

  • 5

我正在尝试将Aiogram3和asyncpg结合起来,但我对异步缺乏理解。

我尝试以这种方式启动数据库和机器人:

dp = Dispatcher()
adb = DB(DSN)


@dp.message(CommandStart)
async def start(message: Message):
    async with adb.pool.acquire() as conn: # взять подключение из пула и потом вернуть обратно;
        x = await conn.fetch('SELECT * FROM manga;')
    print(x)
    await message.answer('Работает.')


async def main():
    bot = Bot(token=TOKEN)

    await adb.connect()
    await dp.start_polling(bot)

if __name__ == '__main__':
    asyncio.run(main())
class DB:
    def __init__(self, dsn):
        self.dsn = dsn
        self.pool = None

    async def connect(self):
        self.pool = await asyncpg.create_pool(self.dsn) # создать пулл подключений;

    async def close(self):
        await self.pool.close()

但我意识到这里没有异步的味道,两个协程相互阻塞并按顺序工作,而不是异步。

原则上,我还没有找到任何有价值的使用示例asyncpg,尽管该库在所有类似库中的速度似乎是无与伦比的,因为它不使用文本指令,而是通过 C 访问字节代码。

如果有任何最佳实践,我会很高兴阅读它。

python
  • 2 个回答
  • 33 Views
Martin Hope
mrBars1k
Asked: 2024-04-07 08:54:37 +0000 UTC

查找相邻(顶部和底部)的表字段

  • 5

我无法想出或找到一种方法来查找给定字段中最接近的相邻字段。

例如表:

SELECT chapter, title FROM chapters 
ORDER BY chapter ::float 
WHERE title = '2';

 chapter | title
---------+-------
 1       |     2
 2       |     2
 3       |     2
 5       |     2
 5.5     |     2
 6       |     2
 12      |     2
 13      |     2
 14.5    |     2

假设我想从 中找到相邻字段chapter = '5'。

应该找到顶部5.5和底部3。

我唯一能想到的就是简单地将步长相对于给定值改变+1或-1,但这样我就可以跳过那些相同的5.5或相对于小数的整数。

这种采样在Python项目中是必要的,因此使用它提取此类字段的方法是合适的。

我在 ChatGPT 中发现了一种奇怪但看似有效的方法(出于绝望),但它看起来很可怕、不优雅,而且很可能不可靠。我目前的 SQL 值不足以精确定位和判断。

            WITH nearest_chapters AS (
            SELECT chapter, title,
            LAG(chapter) OVER (ORDER BY chapter::float) AS prev_chapter,
            LEAD(chapter) OVER (ORDER BY chapter::float) AS next_chapter
            FROM chapters WHERE title = '2'
            )
                SELECT chapter, title
                FROM nearest_chapters
                WHERE chapter = '5'
                OR prev_chapter = '5'
                OR next_chapter = '5';
 chapter | title
---------+-------
 3       |     2
 5       |     2
 5.5     |     2

事实上,没有必要通过一个请求来做到这一点。最主要的是找到邻近的值,无论它们是浮点型还是整数型。我的意思是字符串表示形式,因为章节数据类型是 varchar。

sql
  • 1 个回答
  • 17 Views
Martin Hope
mrBars1k
Asked: 2024-03-06 19:51:57 +0000 UTC

考虑计数合并 M:M 表中的两个样本

  • 5

共有三个表:艺术、标签和用于标记每件艺术的链接表。

main_tags — 所有标签;

艺术——艺术;

tag_to_art - 标签和艺术之间的连接;

表中部分数据:

SELECT id, ru FROM main_tags ORDER BY id ASC LIMIT 5;

 id |       ru
----+-----------------
  2 | мужчина
  3 | девушка
  4 | длинные волосы
  5 | короткие волосы
  6 | на улице
SELECT id FROM arts;

 id
----
  4
  5
SELECT * FROM tag_to_art;

         tag          | art
----------------------+-----
 девушка              |   5
 девушка              |   4
 длинные волосы       |   5
 на улице             |   4

原来id为4的art有两个标签:女孩和街头,而art 5有女孩和长发。

您可以通过以下方式找到按 id 放置在单独艺术品上的所有标签:

SELECT main_tags.id, tag_to_art.tag
FROM main_tags
JOIN tag_to_art ON main_tags.ru = tag_to_art.tag
WHERE tag_to_art.art = '4';

 id |         tag
----+----------------------
  6 | на улице
  3 | девушка

通过这种方式,您可以了解标签被附加到不同艺术品上的次数:

SELECT COUNT(tag) FROM tag_to_art
WHERE tag = 'девушка';

 count
-------
     2

问题: 如何组合两个查询以获得如下输出:

 id |         tag          | count
----+----------------------+-------
  4 | длинные волосы       |     1
  3 | девушка              |     2

我的尝试:

    art_id = 4 # сюда приходит любой id по запросу

    cur.execute(f"""SELECT main_tags.id, tag_to_art.tag, COUNT(tag_to_art.tag) AS count
                FROM main_tags
                JOIN tag_to_art ON main_tags.ru = tag_to_art.tag
                WHERE tag_to_art.art = '{art_id}'
                GROUP BY main_tags.id, tag_to_art.tag
                ORDER BY count, date DESC
                """)

    data = cur.fetchall()

唉,这样几乎一切都是正确的,但它只计算标签在特定艺术品上使用的次数,而不是在整个表中。

 id |         tag          | count
----+----------------------+-------
  4 | длинные волосы       |     1
  3 | девушка              |     1 # но здесь должно быть 2, оно подсчитало только на одном арте

我需要使用一个查询(可能带有子查询)或 Python 工具来使输出看起来符合要求。

python
  • 1 个回答
  • 13 Views
Martin Hope
mrBars1k
Asked: 2024-02-10 01:58:39 +0000 UTC

不在 tkinter 窗口中设置默认值

  • 5

无法设置 Combobox 或 Spinpox 的默认值。在主窗口中,一切正常,但如果您运行完全相同的操作,但在单独的窗口中,在其他窗口之上,则不会指示该值,尽管您可以从下拉列表中选择一个选项。

简化代码:

from tkinter import *
from tkinter import ttk

mainw = Tk()

## ОКНА;
tab_control = ttk.Notebook(mainw)
add_tag = ttk.Frame(tab_control)

tab_control.add(add_tag, text="Add tags")
tab_control.pack(expand=1, fill='both')

default_authors_data = StringVar(value="pixiv")

authors_list_data = ["pixiv", "twitter", "artstation", "devianart", "instagram", "other"]
authors_list = ttk.Combobox(add_tag, values=authors_list_data, textvariable=default_authors_data, state="readonly", width=18)
authors_list.pack()

def description_window():
    popup = Toplevel()
    popup.title("Menu:")

    type_options = ["description", "object", "other", "author", "copyright", "character", "unknown"]
    type_selected_value = StringVar(value="description") ## значение по умолчанию;

    type_combo = ttk.Combobox(popup, values=type_options, textvariable=type_selected_value, state="readonly", width=20, font=("Arial", 13))
    type_combo.pack(side='top', anchor='w', padx=30, pady=10)

descption_window_btn = Button(add_tag, text="Check description", command=description_window, width=16)
descption_window_btn.pack()

mainw.mainloop()

单击主窗口中的“检查描述”按钮后,顶部会打开一个附加窗口,其中有一个下拉列表,其中列出了列表中的指定值。默认情况下,应从type_selected_value (描述)变量设置该值,但实际上根本没有值。您需要手动选择。

在主窗口中,完全相同的下拉列表,只是具有不同的值,可以正常工作并设置默认值。

有没有办法解决这个问题或者问题的原因是什么?

python
  • 1 个回答
  • 27 Views
Martin Hope
mrBars1k
Asked: 2023-11-25 06:40:42 +0000 UTC

即使触发了 CONSTRAINT,SERIAL 也会递增 ID

  • 5

有一个 ID类型为SERIAL,即输入数据后数字自动递增。还有第二列,例如名称(varchar)。

名称对数据的唯一性有限制。

CREATE TABLE IF NOT EXISTS users (
ID SERIAL PRIMARY KEY,
Name varchar(150) NOT NULL UNIQUE);

假设该表是:

| ID | Name |
| 1  | Pavel|

然后我尝试输入我知道不符合限制的数据。

INSERT INTO users (Name) VALUES ('Pavel');

将出现唯一性错误并且不会输入数据。

接下来,我输入新的相关数据。

INSERT INTO users (Name) VALUES ('Kristina');

该表如下所示:

| ID |   Name   |
-----------------
| 1  | Pavel    |
| 3  | Kristina |

问题的本质是:尝试输入数据失败后,自动增量增加了ID值,当输入新数据时,ID会跳序(跳过值为2的ID)。

当然,这在很大程度上只是一个美观问题,但我想知道是否有足够的方法以标准或非 sql 方式修复此问题。

我在项目中使用python的方式,竟然成为解决问题的“拐杖”,但我对此并不满意。

def setval():
    cur.execute("SELECT ID, Name FROM users ORDER BY id;")
    data = cur.fetchall()
    cur.execute("DELETE FROM users;")
    for index, row in enumerate(data):
        cur.execute("""
            INSERT INTO users (ID, Name)
            VALUES (%s, %s)
        """, (index + 1, row[1]))
    cur.execute("""SELECT setval('users_ID_seq', (SELECT MAX(id) FROM users));""")
    adb.commit()
python
  • 1 个回答
  • 46 Views
Martin Hope
mrBars1k
Asked: 2023-06-26 19:19:10 +0000 UTC

如何在数据库中正确存储 \n 连字符以便 python 接受它们?

  • 5

当从用于换行的数据库中获取句子时\n,\n 被视为仅两个字符。

如果您像往常一样在代码中手动输入 \n,则它可以正常工作。

例子:

数据库Ex表中的Vote列存储:

\nВарианты ответа:\n**A.** Traveled\n**B.** Traveling\n**C.** Travel\n**D.** Travels

选择并插入变量以进行输出:

    cur.execute("""SELECT Vote FROM Ex""")
    mess = cur.fetchone()

    await ctx.send(f"{mess[2]}")

在输出中我得到:\nВарианты ответа:\nA. Traveled\nB. Traveling\nC. Travel\nD. Travels

我显示的消息不和谐,但这与案例无关。

如何正确地将传输存储在数据库中以便python感知它们?

python
  • 1 个回答
  • 55 Views
Martin Hope
mrBars1k
Asked: 2022-09-19 11:29:34 +0000 UTC

通过不和谐输入时外键验证不起作用SQLite3

  • 0

三个表具有多对多关系,两个主键和一个通过级联更新和删除链接它们。

为了便于理解:

CREATE TABLE tag_art (
    artID INT NOT NULL
              REFERENCES art (idA) ON UPDATE CASCADE
                                   ON DELETE CASCADE,
    tagID TEXT NOT NULL
              REFERENCES tag (idT) ON UPDATE CASCADE
                                   ON DELETE CASCADE,
    CONSTRAINT fk_tagart PRIMARY KEY (
        artID,
        tagID
    )
);

如果我输入 sqlite studio 或 console INSERT INTO tag_art (artID, tagID) VALUES (1, 'test'),它将不起作用,因为标记表在 idT 列中没有测试值。一切都正确完成。如果我输入现有值而不是测试,那么它将允许输入此类数据。

底线:如果相同的请求不是直接发出的,而是通过不和谐的聊天和团队发出的,这将停止工作。例子:

import discord
from discord.ext import commands
import sqlite3

intents = discord.Intents.default()
intents.message_content = True 
bot = commands.Bot(command_prefix = '!', intents=intents) 

with sqlite3.connect("name.db") as adb:
    cur = adb.cursor()

    @bot.command()
    async def test(ctx):
        cur.execute(f"""INSERT INTO tag_art (artID, tagID) VALUES
        ('1', 'test')
        """)
        adb.commit()
        await ctx.send("Данные успешно приняты!")

bot.run('token')

它跳过这样的输入并进入值测试,绕过外键约束,尽管请求是相同的。

但是如果你输入一个已经存在的值,那么它会阻止它并阻止命令被执行,这意味着检查仍然有效,但只是部分有效。如果您随后手动尝试将此值更改为程序中另一个不合适的值,它将不允许,因为它应该是。

如果您知道为什么会发生这种情况,discord 如何绕过外键限制以及如何解决,欢迎对此案的任何回答。

python
  • 0 个回答
  • 0 Views
Martin Hope
mrBars1k
Asked: 2022-08-29 00:23:52 +0000 UTC

Discord bot 仅向 PM 发送消息,但在服务器上不起作用

  • 0

该机器人在私人消息中工作正常,但在任何情况下都不能在频道上工作。所有权利都是在受邀时授予的,甚至是在频道本身上授予的,没有任何限制,无论哪个频道都没有关系。

请帮我解决这个问题,它对我不起作用。

代码示例:

import discord
import json
import requests
from discord.ext import commands

bot = commands.Bot(command_prefix = '/')

@bot.event

async def on_ready():
    print('Я готов')

@bot.command()

async def hello(ctx):
    await ctx.send('Test10')


@bot.command()

async def nya(ctx):
    await ctx.send('Hello there')

@bot.command()
async def hello2(ctx):
    author = ctx.message.author

    await ctx.send(f'Hello, {author.mention}!')

@bot.command()
async def fox(ctx):
    response = requests.get('https://some-random-api.ml/img/fox') # Get-запрос
    json_data = json.loads(response.text) # Извлекаем JSON

    embed = discord.Embed(color = 0xff9900, title = 'Random Fox') # Создание Embed'a
    embed.set_image(url = json_data['link']) # Устанавливаем картинку Embed'a
    await ctx.send(embed = embed) # Отправляем Embed

bot.run('Здесь токен')
python
  • 1 个回答
  • 43 Views
Martin Hope
mrBars1k
Asked: 2022-08-28 17:59:23 +0000 UTC

机器人如何通过 url 在 telegra.ph 中插入图像?

  • 0

我需要机器人获取图像的 url 地址,例如从 discord 中,并将其插入到 telegra.ph 文章中,它将 url 转换为图像。如果这是手动完成的,那么您需要插入一个链接并按 Enter,只有这样图像才会成为图像,而不是链接。

但是,如果您只是插入一个链接,它将仍然是文本。所以机器人插入了网址,但链接并没有变成图片。

我个人没有找到合适的 API 或模块,也许我是盲人。帮助找到解决方案。

一个工作代码的例子,但有一个问题:

from telegraph_api import Telegraph
import asyncio
import random

random_1 = random.randint(99999, 99999999999)
random_2 = random.randint(99999, 99999999999)

async def main():
    telegraph = Telegraph()
    # Новый аккаунт
    await telegraph.create_account(random_2, author_name=random_1)
    # Статья
    new_page = await telegraph.create_page(
        random_1,
        "https://media.discordapp.net/attachments/1013153256215691344/1013153595480342658/FZ9Pp5LaUAAkNHa_.jpg"
    )

    # Результат
    print(new_page.url)


asyncio.run(main())
python
  • 2 个回答
  • 61 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5