Mysql CONCAT с peewee - PullRequest
       29

Mysql CONCAT с peewee

1 голос
/ 25 апреля 2019

Я использую peewee для взаимодействия с моей базой данных.
У меня есть для следующей схемы:

CREATE TABLE `chat` (
  `id` int(11) NOT NULL,
  `user_a` int(11) NOT NULL,
  `user_b` int(11) NOT NULL,
  `hash` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `chat` (`id`, `user_a`, `user_b`, `hash`) VALUES
(1, 1, 2, '1_2'),
(2, 6, 1, '1_6');

-- --------------------------------------------------------

CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `user` (`id`, `name`) VALUES
(1, 'John'),
(2, 'William'),
(3, 'Mike'),
(4, 'Liam'),
(5, 'Noah'),
(6, 'Mason'),
(7, 'Ethan'),
(8, 'Ava');

И я пытаюсь построить такой запрос (мне нужновыберите человека, с которого нужно начать новый чат. Есть ли лучшее решение для этой проблемы?):

SELECT id, name FROM user WHERE CONCAT(id, "_", 2) NOT IN (SELECT hash FROM chat) AND CONCAT(2, "_", id) NOT IN (SELECT hash FROM chat)

Но я не знаю, как создать такой запрос с peewee.Вот модель peewee:

class BaseModel(Model):
    class Meta:
        database = db

class User(BaseModel):
    name = CharField()

class Chat(BaseModel):
    user_a = ForeignKeyField(User, backref='chats_inviter')
    user_b = ForeignKeyField(User, backref='chats_invited')
    hash = CharField(unique=True)

При создании запроса я ошибся в операции concat (peewee выполняет оператор "||" и пытается преобразовать разделитель "_" в целое числовместо использования ключевого слова CONCAT).

Могу ли я что-нибудь сделать, чтобы peewee сделал правильное предложение "concat"?

1 Ответ

1 голос
/ 27 апреля 2019

Ваш пример:

SELECT id, name FROM user WHERE CONCAT(id, "_", 2) NOT IN (SELECT hash FROM chat) AND CONCAT(2, "_", id) NOT IN (SELECT hash FROM chat)

Вы можете написать:

q = (User
     .select()
     .where(
        fn.CONCAT(User.id, '_', 2).not_in(Chat.select(Chat.hash)),
        fn.CONCAT(2, '_', User.id).not_in(Chat.select(Chat.hash))))

Вы можете выразить любую функцию sql с помощью волшебного помощника Peewee "fn":

fn.CONCAT(User.id, '_', 2)  # Will generate the appropriate SQL.
...