Python中第三方库Faker的使用详解

1 docker安装clickhouse

clickhouse官方提供了默认的镜像,直接使用即可。官方文档参考:https://hub.docker.com/r/yandex/clickhouse-server/。

(1)拉取clickhouse的docker镜像

docker search clickhouse

clickhouse表加索引SQL_数据库

docker pull yandex/clickhouse-server

docker pull yandex/clickhouse-client

(2)启动server端

docker run -d --name clickhouse --ulimit nofile=262144:262144 -p 8123:8123 -p 9000:9000 -p 9009:9009 yandex/clickhouse-server

其中-d 代表后台运行 --name 是你自定义的名字 -p是容器端口映射到当前主机端口。端口必须映射出来,这样其他主机就可以远程访问该服务。

用自定义配置文件启动容器 需要先将配置文件拷贝出来。 docker run -d --name docker-clickhouse --ulimit nofile=262144:262144 -p 8123:8123 -p 9000:9000 -p 9009:9009 -v /etc/clickhouse-server/config.xml:/etc/clickhouse-server/config.xml yandex/clickhouse-server

(3)进入容器运行

docker ps -a 查看容器

docker exec -it docker-clickhouse /bin/bash 进入容器

clickhouse-client 进入clickhouse命令行

show databases 查看所有的数据库

clickhouse表加索引SQL_docker_02

(4)配置远程访问

clickhouse 允许远程访问,将clickhouse的配置文件拷贝出来

docker cp clickhouse-server:/etc/clickhouse-server/ /etc/clickhouse-server/

修改 /etc/clickhouse-server/config.xml 中注释去掉<listen_host>::</listen_host>

2 客户端的访问接口

ClickHouse 服务端的底层访问接口支持 TCP 和 HTTP 两种方式,其中 TCP 拥有更好的性能,其默认监听 9000 端口,主要用于集群间的内部通信及 clickhouse-client 客户端进行连接;而 HTTP 协议则拥有更好的兼容性,可以通过 REST 服务的形式被广泛用于编程语言的客户端,其默认监听 8123 端口。

2.1 交互式执行

使用客户端clickhouse-client连接服务端 通过输入 clickhouse-client 进入命令行、然后再执行 SQL 的方式叫做 “交互式执行”,一般用于调试、运维、开发和测试等场景。

通过交互式执行的 SQL 语句,相关查询结果会统一记录到 ~/.clickhouse-client-history 文件中,可以作为审计之用。

docker exec -it docker-clickhouse /bin/bash

clickhouse-client
clickhouse-client --host 地址 --port 端口 --user 用户 --password 密码

fd7b524680b5 :) show databases;
2.2 非交互式执行

非交互式执行主要用于批处理场景,诸如对数据的导入和导出操作,在执行脚本命令时,需要追加 --query 参数指定执行的 SQL 语句。

(1)在导入数据时,它可以接收操作系统的 stdin 标准输入作为写入的数据。所以 cat 命令读取的文件流,将会作为 INSERT 查询的数据输入。

cat xxx.csv | clickhouse-client --query "INSERT INTO some_table FORMAT CSV"

(2)而在数据导出时,则可以输出流重定向到文件:

clickhouse-client --query "SELECT * FROM some_table" >> xxx.csv

(3)默认情况下,clickhouse-client 一次只能运行一条 SQL 语句,如果需要执行多次查询,则需要在循环中重复执行,这显然不是一种高效的方式。此时可以追加 --multiquery 参数,它可以支持一次运行多条SQL查询,多条查询之间使用分号分隔,比如:

clickhouse-client --multiquery --query "select 1;select 2;select 3;"
clickhouse-client --multiquery --query "select 1;select 2;select 3;" >> xxx.csv

常用的相关参数

--host/-h: 指定连接的服务端的地址, 默认是 localhost,如果服务端的地址不是 localhost, 则需要依靠此参数进行指定, 例如 clickhouse-client -h xx.xx.xx.xx。
--port: 服务端的 TCP 端口, 默认是 9000,如果服务端监听的不是 9000, 则需要此参数指定。
--user/-u: 登录的用户名, 默认是 default。如果使用非 default 的用户名登录, 则需要使用此参数指定。
--password: 登录的密码, 默认值为空。如果在用户定义中未设置密码, 则无需填写(比如默认的 default 用户,我们没有设置密码)。
--database/-d: 登录之后所在的数据库, 默认为 default。
--query/-q: 只能在非交互式查询时使用, 用于执行指定的 SQL 语句。
--multiquery/-n: 在非交互式执行时, 允许一次运行多条 SQL 语句, 多条语句之间用分号隔开。
--time/-t: 在非交互式执行时, 会打印每条 SQL 的执行时间。
3 Python连接ClickHouse服务端3.1 clickhouse-driver(9000)

pip install clickhouse-driver

from clickhouse_driver import Client
# 需要指定具体的 ip
client = Client(host="192.168.1.147", port=9000)
print(client.execute("show databases"))

指定用户名和密码的形式

from clickhouse_driver import Client
#可以再加个连接超时时间send_receive_timeout=send_receive_timeout
client = Client(host=host, port=port, user=user, password=password,database=database)
result = client.execute("select * from 数据库.表 limit 10")
print(result)
3.2 sqlalchemy_clickhouse(8123)

还可以通过 sqlalchemy 去连接,但是默认情况下 sqlalchemy 找不到对应的 dialect,我们需要再安装一个模块:pip install sqlalchemy_clickhouse==0.2.2,安装之后就可以使用了。

from sqlalchemy import create_engine
engine = create_engine("clickhouse://192.168.1.147:8123/default")
engine.execute("show databases").fetchall()

指定用户名和密码的形式

from sqlalchemy import create_engine

host = "192.168.1.147"
user = "default"
password = "bigdata"
db = "default"
port = 8123 # http连接端口
engine = create_engine('clickhouse://{user}:{password}@{host}:{port}/{db}'
                .format(user = user,
                        host = host,
                        password = password,
                        db = db,
                        port = port))
engine.execute("show databases").fetchall()

用户口令中含有特殊字符@的情况下,如何正确链接数据库。

from urllib.parse import quote_plus as urlquote
password = urlquote("ClickhouseTest@190")
4 批量写入
# -*- coding: UTF-8 -*-
from faker import Faker
from clickhouse_driver import Client
client = Client(host="192.168.1.134", port=9000, user="default", password="bigdata")

f = Faker(locale="zh_CN")  # 生成 1 万条测试数据,Age 均为 26
data = [str((f"{i}", f.name(), 26, f.address())) for i in range(100000)]
sql = f"INSERT INTO people VALUES {', '.join(data)}"

client.execute(sql)