Mysql CONCAT 与 peewee
Mysql CONCAT with peewee
我正在使用 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 一个人开始新的聊天。这个问题有更好的解决方案吗?):
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" 条款吗?
你的例子:
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.
我正在使用 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 一个人开始新的聊天。这个问题有更好的解决方案吗?):
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" 条款吗?
你的例子:
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.