DuckDB_SQL-使用示例以及和PG之间的概念-代码示例

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连接数据库
posted @ 2024-08-16 12:33  辰令  阅读(23)  评论(0编辑  收藏  举报