首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++中通过mysql-x-devapi插入mysql内置函数的结果?

如何在C++中通过mysql-x-devapi插入mysql内置函数的结果?
EN

Stack Overflow用户
提问于 2022-06-27 23:23:50
回答 2查看 40关注 0票数 0

我正在使用mysql-x-devapi,需要将一行插入到表中,并将服务器的UNIX_TIMESTAMP()放在列中:

代码语言:javascript
复制
sql_client_.getSession().getDefaultSchema()
    .getTable("event")
    .insert("title", "time")
    .values("event title", "UNIX_TIMESTAMP()")
    .execute();

这段代码给出了: CDK错误:第1行“时间”列的不正确整数值'UNIX_TIMESTAMP()‘

如何使用xdevapi (而不是需要sql字符串的sql命令)来完成这个任务?

在更新表时,我能够在mysqlx::expr("UNIX_TIMESTAMP()")函数中使用set。同样的方法不适用于insert,但如果出现以下错误,则会失败:

代码语言:javascript
复制
/usr/include/mysql-cppconn-8/mysqlx/devapi/table_crud.h:157:17: error: ‘mysqlx::abi2::r0::internal::Expression::Expression(V&&) [with V = mysqlx::abi2::r0::internal::Expression&]’ is private within this context
  157 |       add_values(get_impl(), rest...);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-29 04:52:45

我用了mysqlx::expr("UNIX_TIMESTAMP()")

代码语言:javascript
复制
sql_client_.getSession().getDefaultSchema()
    .getTable("event")
    .insert("title", "time")
    .values("event title", mysqlx::expr("UNIX_TIMESTAMP()"))
    .execute();

然后通过触摸修正编译错误:

/usr/include/mysql-cppconn-8/mysqlx/devapi/table_crud.h取代:

代码语言:javascript
复制
  template<typename... Types>
  TableInsert& values(Types... rest)
  {
    try {
      add_values(get_impl(), rest...);
      return *this;
    }
    CATCH_AND_WRAP
  }

通过以下方式:

代码语言:javascript
复制
  template<typename... Types>
  TableInsert& values(Types&&... rest)
  {
    try {
      add_values(get_impl(), std::forward<Types>(rest)...);
      return *this;
    }
    CATCH_AND_WRAP
  }

/usr/include/mysql-cppconn-8/mysqlx/devapi/detail/crud.h取代:

代码语言:javascript
复制
  template <typename... T>
  static void add_values(Impl *impl, T... args)
  {
    Add_value::Impl row{ {}, 0 };
    Args_processor<Add_value>::process_args(&row, args...);
    Add_row::process_one(impl, row.first);
  }

通过以下方式:

代码语言:javascript
复制
  template <typename... T>
  static void add_values(Impl *impl, T&&... args)
  {
    Add_value::Impl row{ {}, 0 };
    Args_processor<Add_value>::process_args(&row, std::forward<T>(args)...);
    Add_row::process_one(impl, row.first);
  }
票数 0
EN

Stack Overflow用户

发布于 2022-06-28 14:01:37

X DevAPI用户指南提供了一些关于应该支持或不支持什么的提示。在这种情况下,正如您可以从功能定义文档中看到的那样,values()方法需要一个Literal,因此,甚至mysqlx.expr()都无法工作。

在您的示例中,查看错误消息,这意味着time列可能是某种INTEGER数据类型。给定"UNIX_TIMESTAMP()"是一个字符串(因为表达式没有被计算),它不会以任何方式被胁迫,并且只对其他列数据类型(如VARCHAR )起作用。

理论上,据我所知,没有什么能真正阻止API允许计算表达式。X协议适用于,但我不完全确定X插件本身也是如此。我建议您使用public MySQL 虫追踪器和相应的类别(可能是MySQL Connectors: Document Store: DevAPI)来请求该特性。

免责声明:我是MySQL X DevAPI连接器Node.js的主要开发人员

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72779225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档