通用的问题
数据库存储的位置在那里;
数据库的所有者是谁;
其它用户如何来访问这个数据库;
duckdb
DuckDB 是阿姆斯特丹 Centrum Wiskunde&Informatica(CWI)数学和理论计算研究中心的学者们的创意,
它嵌入在一个主机进程中。无需安装、更新或维护 DBMS 服务器软件
程序
DuckDB 的二进制库+头文件
数据文件
.db 以及 .db.wal
结构--Database, Catalog and Schema Tables and Views Rows Columns
file--用户的数据库名称--databasename-database_oid
information_schema pg_catalog main
system
information_schema main pg_catalog
temp
information_schema main pg_catalog
DuckDB 的模块介绍--代码实现
SQL Parser --> Logical Planner --> Optimizer --> Physical Planner --> Execution Engine
Transaction and Concurrency Control
Storage
###概念
1.information_schema.schemat
schema_name Name of the schema. VARCHAR 'main'
2.pg_catalog
standard PostgreSQL pg_catalog functions and views for compatibility with PostgreSQL database and SQL syntax
3.main
表 视图 索引 存储过程 数据类型 函数 扩展 保留关键字
duckdb一些主要的概念词
databases, schemas,
indexes, sequences, extensions, functions, types, configuration settings, and reserved keywords
information_schema.tables
The schema the table or view belongs to. VARCHAR 'main'
驱动:
duckdb_jdbc-0.9.2.jar
工作方式
DuckDB 支持内存型和持久化型两种工作模式
内存型不持久化数据,采用 InMemoryBlockManager 来管理数据
持久化型数据 采用 SingleFileBlockManager 来管理外存上的数据
从命令行中学习-SQL环境下Catalog和Schema都属于抽象概念
数据库--databasename-database_oid
current database
数据库 schema含义数据库Schema有两种含义,
一种是概念上的Schema,指的是一组DDL语句集,该语句集完整地描述了数据库的结构。
还有一种是物理上的 Schema,指的是数据库中的一个名字空间
current_schemas(true) ['temp', 'main', 'pg_catalog']
Catalog Schema User
user username password
1.Cluster > Catalog > Schema > Table > Columns & Rows
So in both Postgres and the SQL Standard we have this containment hierarchy:
A computer may have one cluster or multiple.
A database server is a cluster.
A cluster has catalogs. ( Catalog = Database )
Catalogs have schemas. (Schema = namespace of tables, and security boundary)
Schemas have tables.
Tables have rows.
Rows have values, defined by columns.
2.PostgreSQL中内建了对表常规访问的支持,
但是所有的索引方法则是在pg_am中描述
3.Constraints,是限制、约束
constraint_type 约束类型 CHECK, FOREIGN KEY, PRIMARY KEY, NOT NULL, UNIQUE.
CHECK约束 是指约束表中某一个或者某些列中可接受的数据值或者数据格式
唯一约束
5种完整性约束:
1)NOT NULL: 指定某列不能为空
2)UNIQUE: 指定某列或某几列不能重复
3)PRIMARY KEY: 指定该列的值可以唯一地标识该条记录
4)FOREIGN KEY: 指定该行记录从属于主表中的一条记录,主要用于保证参照完整性
5)CHECK: 指定一个布尔表达式,用于指定对应列的值必须满足该表达式
【mysql不支持check】
2类约束:采用列级约束语法或者表级约束语法
1)单列约束:
2)多列约束:
指定约束的时机:
1)建表的同时为相应的数据列指定约束
2)建表后创建,以修改表的方式来增加约束(用alter来修改)
select * from duckdb_settings();
select *from duckdb_keywords();
select * from duckdb_databases();
select * from duckdb_schemas();
select * from duckdb_functions()
select * from duckdb_tables()
select * from duckdb_views();
select * from duckdb_indexes();
select * from duckdb_columns();
select * from duckdb_types()
select * from duckdb_constraints();
select * from duckdb_sequences();
select * from duckdb_extensions();
select * from duckdb_optimizers();
其他类似的数据库
MySQL初始化完成后会创建出4个系统库,
分别是information_schema、performance_schema、mysql、sys
infomation_schema 提供数据库的元数据,比如数据库名、表名、索引等,可以当作字典表
mysql 是 mysql的核心库,主要存储数据库用户、权限等 mysql 自身需要使用的信息
performance_schema 用于收集数据库服务器的性能数据,以便分析问题。比如 SQL 的执行次数、耗时、锁等信息
postgres 刚初始化的集群中,默认有一个数据库 postgres,有一个超级管理员用户,默为当前系统的用户
初始化数据库后默认的表空间有pg_default、pg_global
SQLite的默认库是一个空数据库,SQLite 在创建数据库时创建架构表
每个 SQLite 数据库都包含一个 "schema table" ,用于存储该数据库的架构。
数据库的架构是对数据库中包含的所有其他表、索引、触发器和视图的描述
main.sqlite_schema " 或 "temp.sqlite_schema"
SQLite 数据库都有一个叫 SQLITE_MASTER 的表,
里面存储着数据库的数据结构(表结构、视图结构、索引结构等),只可以对它使用查询语句
sqlite_schema 替代名称也被认可,包括: sqlite_master sqlite_temp_schema sqlite_temp_master
数据导入
import duckdb
import os
if __name__=="__main__":
csv_dir = r"~/duckdb_exp"
file_nm = r"roadline.csv"
## dbeaver中 duckdb 可以不导入到数据库中,就可以直接查询<前提是已经安装好debeaver 以及duckdb 以及dbeaver的duckdb驱动>
## dbeaver “新建 SQL 编辑器”,这样我们就可以在里面写 SQL 语句
## 直接可以查询出数据结果,而不需要像一般数据库需要先建表、导入数据后才能查询
## select num,sum(pcd_cnt) from "~/duckdb_exp/road.csv" group by num
input_csv_file = os.path.join(csv_dir,file_nm)
# 如果一张表我们要经常查询还是需要将其导入到数据库
out_file_db = os.path.join(csv_dir,'file.db')
if not os.path.exists(out_file_db):
table_nm = "road_info"
conn = duckdb.connect(out_file_db)
c = conn.cursor()
sql_cmd = ("CREATE TABLE {0} AS SELECT * FROM read_csv_auto('{1}') ").format(table_nm,input_csv_file)
## sample_size=-1,这样可以参数数据中的所有行,来创建适当的数据类型。
c.execute(sql_cmd)
conn.close()
参考
duckdb从入门到精通:数据导入 https://zhuanlan.zhihu.com/p/627565479
和pandas一起使用
import pandas as pd
import duckdb
import os
if __name__ =="__main__":
root_dir = r"/data/orig_stat_src"
class_grade_task = os.path.join(root_dir,r"class_grade_task.txt")
##data01
task_id = pd.read_csv(class_grade_task,sep="\t")
task_id['ori_grade_nm'] = task_id["grade_nm"].str[:-4]
print(task_id.head())
##data02
grade_path = os.path.join(root_dir,"grade_path.txt")
grade_path_df = pd.read_csv(grade_path,sep="\t")
grade_path_df['ori_grade_nm'] = grade_path_df["grade_path"].str.split("/").str[-1].str.replace("grade_","").str.replace("cor","corr").str[:-4]
print(grade_path_df.head())
#grade_path_df['ori_grade_nm'].to_csv("/data/test.txt",index=None)
#####data03
info_1_df =pd.merge(task_id, grade_path_df, how = 'left', on = "ori_grade_nm")
### duckdb
data = duckdb.query('select task_id,max(task_nm) as task_nm, sum(json_cnt), sum(obj_cnt) from info_1_df group by task_id').df()
print(data)
参考
写规则引擎
RandomFractals duckdb-sql-tools https://github.com/RandomFractals/duckdb-sql-tools/discussions
https://github.com/RandomFractals
https://livebook.manning.com/book/duckdb-in-action/welcome/v-4/
https://github.com/duckdb-in-action/examples/tree/main/ch03
数据库 schema与catalog https://www.cnblogs.com/ECNB/p/4611309.html
https://stackoverflow.com/questions/7022755/whats-the-difference-between-a-catalog-and-a-schema-in-a-relational-database
标签:示例,DuckDB,数据库,grade,duckdb,path,select,schema
From: https://www.cnblogs.com/ytwang/p/17956224