【问题标题】:Mysql CONCAT with peeweeMysql CONCAT 与 peewee
【发布时间】:2019-04-27 21:29:36
【问题描述】:

我正在使用 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”子句吗?

【问题讨论】:

    标签: python mysql peewee


    【解决方案1】:

    你的例子:

    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))))
    

    您可以使用 Peewee 的神奇“fn”助手来表达任何 sql 函数:

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

    【讨论】:

      猜你喜欢
      • 2011-11-23
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      • 2015-10-19
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      相关资源
      最近更新 更多