duckdb
Catalog(目录): 表示整个数据库或数据库管理系统。一个数据库服务器可以包含多个数据库,每个数据库都有自己的 Catalog
1.database --catalog catalog_name
database: In‑Memory vs. Persistent Database
database-- database_list new_db.my_schema:
system
temp
2.Schema 用于组织和分类数据库对象
schema catalog or a schema --namespace
information_schema提供视图以查看表、视图和函数信息,
pg_catalog作为系统Schema,包含系统函数和数据类型定义,对Postgres的正常运行至关重要
pg_catalog.pg_namespace来查看当前数据库中全部的Schema
创建的数据库 database
system
temp
tables(表)
Column(列)
提供了一定程度的隔离和命名空间
代码示例
import pandas as pd
import duckdb
import os
if __name__=="__main__":
root_csv_dir = r"/data/statics_pandas_result.csv"
grade_table_nm = "grade_nm_info"
# 如果一张表我们要经常查询还是需要将其导入到数据库
out_file_db = os.path.join(r"/data/stat",'schools_file.db')
## 文件是否存在--数据库是否存在
if not os.path.exists(out_file_db):
conn = duckdb.connect(out_file_db)
c = conn.cursor()
grade_table_cmd = ("CREATE TABLE {0} AS SELECT * FROM read_csv_auto('{1}') ").format(grade_table_nm,root_csv_dir)
# ## sample_size=-1,这样可以参数数据中的所有行,来创建适当的数据类型。
c.execute(grade_table_cmd)
c.execute("SELECT * FROM {0} limit 5".format(grade_table_nm))
print(c.fetchone())
conn.close()
else:
# 原生方式连接到DuckDB
con = duckdb.connect(database = out_file_db, read_only = False)
## 表 Tables 是否存在-查询系统表pg_tables或information_schema.tables来检查表是否存在
check_sql_cmd = " SELECT * FROM information_schema.tables WHERE table_schema = 'main' AND table_name = '{}' ".format(grade_table_nm)
con.execute(check_sql_cmd)
## Tables 检查结果-- 可以使用IF EXISTS子句来检查表是否存在
if con.fetchone():
print(f"Table {grade_table_nm} exists.")
else:
print(f"Table {grade_table_nm} does not exist.")
marked_table_cmd = ("CREATE TABLE {0} AS SELECT * FROM read_csv_auto('{1}') ").format(grade_table_nm,root_csv_dir)
con.execute(marked_table_cmd)
column_info = con.sql("SELECT * FROM information_schema.columns WHERE table_name = '{}';".format(grade_table_nm))
column_info.show()
grade_dat = con.sql("SELECT * FROM {}".format(grade_table_nm))
grade_dat.limit(3).show()
## 不符合SQL的标识符命名约定使用双引号来包围列名 mysql中使用 ``
quere_sql_cmd = """ select teacher_name,class_name,count(*),sum(student_num),sum("3_grade_cnt_num")
from main.grade_nm_info
group by teacher_name,class_name """
query_dat = con.sql(quere_sql_cmd)
grade_df = query_dat.df()
print("grade_df",grade_df)
# ## 保存数据
# result.to_csv(out_file_path, index=False)
# print(result.head(3))
con.close()
基本技术概念
源码:数据库事务- 事务的ACID特性
session--只有两种执行结果:提交commit或回滚 ROLLBACK (All or Nothing)
悲观机制与乐观机制
悲观锁 LOCK机制
乐观锁(Optimistic Concurrency Control,缩写“OCC”),又叫做乐观并发控制,
MVCC 多版本并发控制(Multiversion concurrency control, MCC 或 MVCC)
MVCC的实现,是通过保存数据在某个时间点的快照来实现的
WAL全称是write ahead log,是PG中的online redo log 也就是先写日志,再写磁盘
数据文件的改变必须先写入日志,即日志记录刷新到永久储存之后,才能被写
(即回滚恢复 REDO)
MVCC通过乐观并发控制提高性能,WAL确保数据完整性并优化IO
隔离级别
redo log(重做日志) undo log(回滚日志) binlog(归档日志)
分布式一致性
2PC(2 Prepare Commit) (协调者宕机问题) (和zab有区别,zab是过半机制)
3PC(CanCommit、PreCommit、DoCommit) (协调者宕机问题)
Paxos算法 (分布式一致性问题最有效的算法)(引入多个协调者)
Raft协议 (引入主节点,竞选确定主节点;节点类型:Follower、Candidate 和 Leader)
1)(3) 称为事务的两阶段提交.整个流程称之为WAL技术,
即write ahead logging技术它的关键点就是先写日志,再写磁盘
Postgresql
0.PostgreSQL模块和代码目录结构
Main函数进来之后,启动Postmaster进程,通过Postmaster发送不同的Postgres进程。
如果Postgres收到Libpq请求,最终会让执行引擎来执行相关命令
1.PostgreSQL 服务进程
2.连接属性
默认数据库是‘postgres',
默认模式‘public'
系统模式主要有 pg_catalog、information_schema、pg_temp等等
pg_catalog是系统Schema,包含了系统的自带函数/数据类型定义等,pg_catalog是保障postgres正常运转的重要基石
information_schema是方便用户查看表/视图/函数信息提供的,它大多是视图,MySQL,SQL Server同样有information_schema这个schema。
3.PGDATA目录包含几个子目录和控制文件。
常见的位置PGDATA是/var/lib/pgsql/data
除此之外,集群配置文件postgresql.conf、pg_hba.conf和pg_ident.conf一般存储在PGDATA
PostgreSQL的 日志文件 主要包括运行日志文件,重做日志文件,事务日志文件,服务器日志文件。
PostgreSQL的 控制文件 主要记录了数据库相关的运行信息。
比如id,open,wal,checkpoint的位置等等,其中controlfile是很重要的文件
PostgreSQL的 WAL文件 通常默认保存在$PGDATA/pg_wal目录下
4.PostgreSQL的常用命令
首先,使用psql连接数据库