注意:镜像bitnami/clickhouse包含服务端和客户端,yandex版本需要使用yandex/clickhouse-server,yandex/clickhouse-server
docker启动命令(允许空密码 -e ALLOW_EMPTY_PASSWORD=yes),clickhouse版本不同,配置文件在的位置也会不一样/etc/clickhouse-server/config.xml
docker run -d --name=clickhouse -e CLICKHOUSE_ADMIN_PASSWORD=admin --ulimit nofile=262144:262144 --volume=$HOME/clickhouse/config.xml:/opt/bitnami/clickhouse/etc/config.xml bitnami/clickhouse:latest
linux系统docker启动命令(与window的区别,window启动需要与管理员运行,如果是麒麟docker需要设置–privileged,不然很多权限之类的问题)
docker run -d --name=clickhouse -p 8123:8123 -v /clcikhouse/data:/var/lib/clickhouse -e CLICKHOUSE_ADMIN_PASSWORD=admin --privileged bitnami/clickhouse:latest
启动容器将clickhouse的这两个配置文件拷贝出来,然后关闭容器,再去挂载启动容器
docker cp clickhouse :/etc/clickhouse-server/users.xml /data/clickhouse/config/users.xml
docker cp clickhouse :/etc/clickhouse-server/config.xml /data/clickhouse/config/config.xml
启动容器将clickhouse的数据挂载
--volume=clcikhouse/clcikhouseData:/var/lib/clickhouse
clickhouse创建数据库命令
CREATE DATABASE IF NOT EXISTS my_database;
clickhouse创建表命令
-- `default`.user_info definition
CREATE TABLE default.user_info
(`id` String,`name` String,`age` Int32,`phone` String,`create_time` Date DEFAULT CAST(now(),'Date')
)
ENGINE = MergeTree
PRIMARY KEY id
ORDER BY id
SETTINGS index_granularity = 8192;
clickhouse表插入数据命令
INSERT INTO user_info(id,name,age,phone)
VALUES('1','张三',16,'13325511231'),('2','李四',20,'13825511231'),('3','马六',18,'18925511231');
clickhouse使用docke命令操作数据库命令
第一种:先进入到clickhouse容器内部,再使用命令clickhouse-client -d my_database -h 127.0.0.1查询
$ clickhouse-client -d my_database -h 127.0.0.1
clickhouse-client参数
–host, -h :服务端host名称,默认 localhost
–port :连接端口,默认9000
–user, -u :用户名,默认 default
–password :密码,默认空
–query, -q :非交互模式下的查询语句
–database, -d :默认当前操作的数据库,默认default
–multiline, -m :允许多行语句查询,在clickhouse中默认回车即为sql结束,可使用该参数多行输入
–format, -f :使用指定的默认格式输出结果 csv,以逗号分隔
–time, -t :非交互模式下会打印查询执行的时间
–stacktrace :出现异常会打印堆栈跟踪信息
–config-file :配置文件名称
第二种:在 ClickHouse 中使用 docker exec 和 clickhouse-client 进行数据库操作(如查询表、创建数据库、删除表、修改表),你可以通过以下方式编写相应的命令( --password=admin是通过密码,如果没有密码可以不写):
创建数据库:
docker exec -it clickhouse-server clickhouse-client --password=admin --query="CREATE DATABASE IF NOT EXISTS my_database"
展示某个库下的全部表命令:
docker exec ecstatic_newton clickhouse-client --password=admin --query="show tables from system;"
查询表:
docker exec -it clickhouse-server clickhouse-client --password=admin --query="SELECT * FROM system.tables"
删除表:
docker exec -it clickhouse-server clickhouse-client --password=admin --query="DROP TABLE IF EXISTS my_table IN my_database"
修改表(例如,添加新列):
docker exec -it clickhouse-server clickhouse-client --password=admin --query="ALTER TABLE my_table ADD COLUMN new_column String"
使用 Mybatis-Plus 更新方法 updateById 在 ClickHouse 中可能会报错,因为 ClickHouse不支持像传统关系型数据库那样直接更新单行数据。相反,在 ClickHouse 中更新数据通常是通过执行带有新值的插入操作来实现的
如果你想在 ClickHouse 中更新数据,可以考虑以下两种方法:
- 插入新数据并删除旧数据:
首先,构造一个新的实体对象,设置需要更新的字段的新值。 使用 Mybatis-Plus 的 insert方法将新的实体对象插入到表中,这将创建一条新的数据行。 如果需要,可以使用 deleteById 方法删除旧数据行,以保持数据的唯一性。- 执行 ClickHouse 的 SQL 更新语句:
直接执行 ClickHouse 支持的 SQL 更新语句,例如 ALTER TABLE … UPDATE … WHERE …。
可以通过 Mybatis-Plus 的 @Select 注解或者直接调用底层的 JDBC 连接来执行这些 SQL 语句。 需要注意的是,由于
ClickHouse 的特性和限制与传统关系型数据库不同,需要根据具体情况选择合适的更新方法,并确保符合 ClickHouse
的规范和性能要求
修改users.xml文件,在中添加如下内容就可以添加用户名:custom,密码:123456
<users><custom><password>123456</password></custom></users>
sprinboot的yml配置
server:port: 8080
# mybatis-plus 配置
mybatis-plus:type-aliases-package: com.example.clickhouse.entitymapper-locations: classpath*:mapper/xml/*.xmlspring:datasource:type: com.alibaba.druid.pool.DruidDataSourceclick:driverClassName: ru.yandex.clickhouse.ClickHouseDriverurl: jdbc:clickhouse://192.168.11.50:8123/defaultusername: defaultpassword:initialSize: 10maxActive: 100minIdle: 10maxWait: 6000
sprinboot的pom配置
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.13</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><!-- clickHouse数据库 --><dependency><groupId>ru.yandex.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.1.53</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
sprinboot的ConnectionClickhouseConfig
package com.example.clickhouse.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** @Description:* @Author: xu* @Data: 2024-2024/2/18-20* @Version: V1.0*/@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.click")
public class ConnectionClickhouseConfig {private String username;private String password;private String driverClassName;private String url;private Integer initialSize;private Integer maxActive;private Integer minIdle;private Integer maxWait;
}
sprinboot的DruidConfig
package com.example.clickhouse.config;import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import javax.annotation.Resource;
import javax.sql.DataSource;/*** @Description:* @Author: xu* @Data: 2024-2024/2/18-20* @Version: V1.0*/
@Configuration
public class DruidConfig {@Resourceprivate ConnectionClickhouseConfig connectionClickhouseConfig;/*** 重写 DataSource** @return*/@Beanpublic DataSource dataSource() {DruidDataSource datasource = new DruidDataSource();datasource.setUrl(connectionClickhouseConfig.getUrl());datasource.setDriverClassName(connectionClickhouseConfig.getDriverClassName());datasource.setInitialSize(connectionClickhouseConfig.getInitialSize());datasource.setMinIdle(connectionClickhouseConfig.getMinIdle());datasource.setMaxActive(connectionClickhouseConfig.getMaxActive());datasource.setMaxWait(connectionClickhouseConfig.getMaxWait());datasource.setUsername(connectionClickhouseConfig.getUsername());datasource.setPassword(connectionClickhouseConfig.getPassword());return datasource;}@Bean("sqlSessionFactory")public SqlSessionFactory sqlSessionFactoryBean(DataSource dynamicDataSource) throws Exception {MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();sessionFactory.setDataSource(dynamicDataSource);/// 创建Configuration对象MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();mybatisConfiguration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class); // 设置日志输出到控制台sessionFactory.setConfiguration(mybatisConfiguration);sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:com/example/clickhouse/mapper/**/xml/*Mapper.xml"));return sessionFactory.getObject();}
}
sprinboot的UserInfo
package com.example.clickhouse.entity;import lombok.Data;
import lombok.experimental.Accessors;import java.io.Serializable;/*** @Description:* @Author: xu* @Data: 2024-2024/2/18-20* @Version: V1.0*/
@Data
@Accessors(chain = true)
public class UserInfo implements Serializable {private static final long serialVersionUID = 1L;private String id;private String name;private Integer age;private String phone;private String email;private String createDay;
}
sprinboot的UserInfoMapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}