1 Востаннє редагувалося xZartsust (11.08.2020 10:53:24)

Тема: Як добавить крапку в колонку таблиці з допомогою с Python кода?

Привіт!!!
В мене є такий код:

іmport discord
from discord.ext import commands
import os
import asyncpg, asyncio
import psycopg2
 
PREFIX = '.'
 
database = os.environ.get('DATABASE')
user = os.environ.get('USER')
password = os.environ.get('PASSWORD')
host = os.environ.get('HOST')
port = os.environ.get('PORT')
 
conn = psycopg2.connect(
    database = f"{database}", 
    user = f"{user}", 
    password = f"{password}", 
    host = f"{host}", 
    port = "5432"
)
 
cursor = conn.cursor()
 
PREFIX=('.')
 
def is_owner_guild(ctx):
    return ctx.author.id == ctx.guild.owner.id
 
class prefix(commands.Cog):
    def __init__(self,bot):
        self.bot = bot
        
    @commands.Cog.listener()
    async def on_guild_join(self, guild):
        join_guild_id = guild.id
        cursor.execute(f'INSERT INTO public."prefixDB" (guild_id, prefix) VALUES ({join_guild_id}' + '.' + ');')
        conn.commit()
 
    @commands.Cog.listener()
    async def on_guild_remove(self,guild):
        remove_guild_id = guild.id
        cursor.execute('DELETE FROM public."prefixDB" WHERE guild_id = ' + f'{remove_guild_id}' + ';')
        conn.commit()
 
    @commands.command()
    @commands.check(is_owner_guild)
    async def prefix(self, ctx):
        cursor.execute('INSERT INTO public."prefixDB"(guild_id, prefix) VALUES (12,12);')
        conn.commit()
 
def setup(bot):
    bot.add_cog(prefix(bot))

Коли бот заходит на сервер то в БД заноситься ади сервера и дефолтний префикс.
Якщо написати щоб записалося тільки айпі сервера то все працює, а з точкою не хоче видає таку помилку:
https://replace.org.ua/uploads/images/9747/0a1864be56e146646342cd5f4bdf923c.png

Да я знаю що воно вважає що там помилка в синтаксисі.
Я провіряв в pgAdmin команду INSERT і там добавлялась крапка, ну і в мене в коді написано так само як і там в кавичках.
Тип комірки prefix: character varying

Якщо зробити так: '"."' ,то видає наступну ошибку:
https://replace.org.ua/uploads/images/9747/34f58a4a2d9c3b8007117970c43b718e.png

2 Востаннє редагувалося koala (11.08.2020 11:21:44)

Re: Як добавить крапку в колонку таблиці з допомогою с Python кода?

Ви, схоже, заплуталися в лапках і внутрішній обробці стрічок. У вас увімкнений режим ANSI_QUOTES, який робить подвійні лапки " синонімом зворотних ` - для позначення ідентифікаторів. Відповідно, якщо вам треба задати стрічку в запиті, то це має бути

INSERT INTO public."prefixDB" (guild_id, prefix) VALUES (1234567890, '.');

Тепер переходимо до того, як такий запит скласти в Python. Підставляння в стрічках - одна з небагатьох тем, де Python досить часто змінює спосіб це робити; але в будь-якому разі не слід плутати різні способи. Тобто або

f"INSERT {x} INTO {Y}"

або

"INSERT "+str(x)+" INTO "+str(y)

або %, або format, але не декілька способів одночасно, ви самі не зможете потім зрозуміти, що відбувається (і не можете ж, правда?) Прибираємо додавання рядків

f'INSERT INTO public."prefixDB" (guild_id, prefix) VALUES ({join_guild_id}' + '.' + ');'

стає

f"INSERT INTO public.`prefixDB` (guild_id, prefix) VALUES ({join_guild_id} '.');"

І одразу видно, що ви забули там кому. Має бути

f"INSERT INTO public.`prefixDB` (guild_id, prefix) VALUES ({join_guild_id}, '.');"

Дивіться: " - для f-стрічки Python, ` - для SQL-ідентифікаторів, ' - для SQL-стрічок. Цього разу вистачило.
Якщо не вистачає лапок - користуйтеся екрануванням лапок: '\''=="'", "\""=='"' (сам символ \, відповідно, представляється  як \\).

Якщо вам треба додати символ лапок у SQL, то він екранується так:

'Це лапка '', використовуй її обережно!'
Подякували: leofun01, xZartsust, plusxx3

3 Востаннє редагувалося xZartsust (11.08.2020 11:33:45)

Re: Як добавить крапку в колонку таблиці з допомогою с Python кода?

Якщо вам треба додати символ лапок у SQL, то він екранується так:

'Це лапка '', використовуй її обережно!'

Так тоді Пайтон буде вважати щo це різні строки

'Це лапка '

і

', використовуй її обережно!'

4

Re: Як добавить крапку в колонку таблиці з допомогою с Python кода?

Ще раз: це в SQL.
А якщо її треба передати з Python, то буде

"'Це лапка '', використовуй її обережно!'"

або

'\'Це лапка \'\', використовуй її обережно!\''
Подякували: leofun01, xZartsust2

5

Re: Як добавить крапку в колонку таблиці з допомогою с Python кода?

Не проходить так
https://replace.org.ua/uploads/images/9747/b08afbbb70a7d5a59d36ddd85e81951b.png

6

Re: Як добавить крапку в колонку таблиці з допомогою с Python кода?

Гм. Дійсно, ` - це в MySQL. А там узагалі лапки потрібні?

f"INSERT INTO public.prefixDB (guild_id, prefix) VALUES ({join_guild_id}, '.');"

Якщо так - то екрануємо подвійні:

f"INSERT INTO public.\"prefixDB\" (guild_id, prefix) VALUES ({join_guild_id}, '.');"

Або одинарні:

f'INSERT INTO public."prefixDB" (guild_id, prefix) VALUES ({join_guild_id}, \'.\');'
Подякували: xZartsust, leofun012

7

Re: Як добавить крапку в колонку таблиці з допомогою с Python кода?

https://replace.org.ua/uploads/images/9747/f6857447d51fbede66e11f200a5d2216.png
Вот скріпт для того щоб вставити в таблицю(pgAdmin 4)

8

Re: Як добавить крапку в колонку таблиці з допомогою с Python кода?

Лапки для ідентифікаторів, загалом, потрібні, щоб мати ідентифікатори з пробілами. Тут пробілів немає, гадаю, має і так спрацювати.

Подякували: xZartsust1

9

Re: Як добавить крапку в колонку таблиці з допомогою с Python кода?

Урааа, запрацювало!
Потрібно було використати це:

f'INSERT INTO public."prefixDB" (guild_id, prefix) VALUES ({join_guild_id}, \'.\');'

Дякую!!!

10 Востаннє редагувалося xZartsust (11.08.2020 12:10:37)

Re: Як добавить крапку в колонку таблиці з допомогою с Python кода?

import discord
from discord.ext import commands
import os
import asyncpg, asyncio
import psycopg2

PREFIX = '.'

database = os.environ.get('DATABASE')
user = os.environ.get('USER')
password = os.environ.get('PASSWORD')
host = os.environ.get('HOST')
port = os.environ.get('PORT')

conn = psycopg2.connect(
    database = f"{database}", 
    user = f"{user}", 
    password = f"{password}", 
    host = f"{host}", 
    port = "5432"
)

cursor = conn.cursor()

PREFIX=('.')

def is_owner_guild(ctx):
    return ctx.author.id == ctx.guild.owner.id

class prefix(commands.Cog):
    def __init__(self,bot):
        self.bot = bot
        

    @commands.Cog.listener()
    async def on_guild_join(self, guild):
        join_guild_id = guild.id
        cursor.execute(f'INSERT INTO public."prefixDB" (guild_id, prefix) VALUES ({join_guild_id}, \'.\');')
        conn.commit()
    '''
    @commands.Cog.listener()
    async def on_guild_remove(self,guild):
        remove_guild_id = guild.id
        cursor.execute(f"DELETE FROM public.`prefixDB` WHERE guild_id = {remove_guild_id};")
        conn.commit()
    '''
    @commands.command()
    @commands.check(is_owner_guild)
    async def prefix(self, ctx):
        cursor.execute('INSERT INTO public."prefixDB"(guild_id, prefix)    VALUES (12,12);')
        conn.commit()

def setup(bot):
    bot.add_cog(prefix(bot))

Вот кінцевий код, для тих хто можливо зіткнеться з такою проблемою :)