3、Windows下安装postgresql


Windows下安装postgresql

使用 EnterpriseDB 来下载安装,EnterpriseDB 是全球唯一一家提供基于 PostgreSQL 企业级产品与服务的厂商。下载地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads。选择12.8版本,之后timescale也是选择12版本,两个版本保存一致。

image-20211028111309321

设置超级用户密码

image-20211028083156993

5432默认端口号

image-20211027130355213

一直next,直到完成安装。其它组件暂时先不安装。

配置环境变量,在Path里

image-20211028111122081

打开pgAdmin

image-20211028111043370

设置密码,两个密码可设置成一样

设置中文显示:File->Preference->UserLanguage 选择简体中文并刷新页面

image-20211027134348365

完成

image-20211028084245909

打开Navicat,连接postgresql

image-20211027135408910

连接成功。

image-20211027135449465

安装TimescaleDB

选择与postgresql对应的版本

image-20211028110516514

关闭postgresql服务

image-20211028110054832

解压timescaledb,以管理员身份运行setup.exe,输入D:\PostgreSQL\12\data\postgresql.conf

image-20211028091559538

除了上面那个路径外其他的选择yes就行。

image-20211028112440934

安装完成后,启动postgresql服务,打开命令行窗口

image-20211028091249349

输入create extension if not exists timescaledb cascade;

image-20211028105951680

出现上图证明TimescaleDB安装成功!

第一个JDBC程序

打开命令行窗口,输入

postgres=# create database jdbcstudy;	//创建数据库
postgres=# \l							//查看数据库

image-20211027150144216

postgres=# \c jdbcstudy				//使用数据库
jdbcstudy=# create table users(
jdbcstudy(# id int primary key,
jdbcstudy(# name varchar(40),
jdbcstudy(# password varchar(40),
jdbcstudy(# email varchar(60),
jdbcstudy(# birthday DATE);			//创建常规表
CREATE TABLE
jdbcstudy=# insert into users values		
(1,'zhansan','123456','zhangsan@sina.com','1980-12-04'),(2,'lisi','123456','lisi@sina.com','1981-12-04'),(3,'wangwu','123456','wangwu@sina.com','1979-12-04');		//插入数据
jdbcstudy=# select * from users;						   //查看表

image-20211027150432495

image-20211027150535037

使用IDEA,新建普通java项目,连接postgresql

image-20211027140835812

image-20211027153413426

可以在这里看到刚才建的users表

image-20211027153455608

导入postgreSQL的JDBC驱动程序jar包(https://jdbc.postgresql.org/download.html)

image-20211027152713099

新建第一个JDBC程序,JdbcDemo01

package com.wang.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcDemo01 {

    public static void main(String[] args) {

        String url = "jdbc:postgresql://localhost:5432/jdbcstudy";
        String user = "postgres";
        String pwd = "201314";
        Connection conn = null;

        try {
            Class.forName("org.postgresql.Driver");
            conn = DriverManager.getConnection(url, user, pwd);
            Statement st = conn.createStatement();
/*  Statement:适合只执行一次或极少执行的sql文。
    PreparedStatement:适合执行需要传参并且会多次执行的sql文,并且一定程度上防止了sql注入。
    CallableStatement:适合执行存储过程。*/

            ResultSet rs = st.executeQuery("select id,name from users");

            while (rs.next()) {
                System.out.println("id="+rs.getString(1)+",name is "+rs.getString(2));
            }
            rs.close();
            st.close();
            conn.close();
        } catch (Exception e) {
            System.out.println(e);
            e.printStackTrace();
        }
    }
}

image-20211027154614364

运行成功。

创建超表

参考官方文档,CREATE | Timescale Docs

进入jdbcstudy数据库,输入create extension if not exists timescaledb cascade;,将PostgreSQL数据库转换为TimescaleDB

image-20211028125110449

创建标准表

CREATE TABLE conditions (
    time        TIMESTAMPTZ       NOT NULL,
    location    TEXT              NOT NULL,
    temperature DOUBLE PRECISION  NULL
);

image-20211028131442814

使用create_hypertable创建超表。(创建分布式超表使用create_distributed_hypertable

SELECT create_hypertable('conditions', 'time');

image-20211028130624804

TimescaleDB基本操作_woai243779594的博客-CSDN博客

添加了一个新的列humidity(需要将任何新增列默认值设置为 NULL,否则将需要填写属于此超表的所有行的此值)

ALTER TABLE conditions ADD COLUMN humidity DOUBLE PRECISION NULL;

数据可以使用标准 SQL 命令插入到超表中

INSERT INTO conditions(time, location, temperature, humidity)
  VALUES (NOW(), 'office', 70.0, 50.0);

可进行多行插入(推荐)

INSERT INTO conditions
  VALUES
    (NOW(), 'school', 73.0, 48.0),
    (NOW(), 'basement', 66.5, 60.0),
    (NOW(), 'garage', 77.0, 65.2);

image-20211028134901556

可以看到,多条插入时时间都是相同的,单批次插入的数据属于同一时间分区。

数据可以使用标准 SQL 命令从超表查询,包括任意子句、命令、连接、子查询、窗口功能、用户定义的功能 (UDF)、子句等。

创建测试表

pgsql常用操作

\l					//列举数据库
\dt					//列举表
\d Person			//查看表结构
\di 				//查看索引

创建Person表

CREATE TABLE Person(
    time TIMESTAMPTZ NOT NULL,
    num INT NULL,
    birthday INT NULL,
    name CHAR NULL,
    age INT NULL,
    city CHAR NULL,
    tel CHAR NULL, 
    PRIMARY KEY(time,num) 
);

image-20211029101600841

SELECT create_hypertable('Person', 'time');

image-20211029093752297

\d Person		//查看表结构

image-20211029095409306

编写java代码,插入10000条数据

package com.wang.jdbc;

import java.io.UnsupportedEncodingException;
import java.sql.*;
import java.util.Calendar;
import java.util.Random;

public class RandomPerson {

    public static void main(String[] args) {

        String url = "jdbc:postgresql://localhost:5432/jdbcstudy";
        String user = "postgres";
        String pwd = "201314";
        Connection conn = null;
        PreparedStatement st = null;

        try {

            Class.forName("org.postgresql.Driver");
            conn = DriverManager.getConnection(url, user, pwd);

            for (int i = 0; i < 10000; i++) {
                int birthday = Birthday();
                Calendar cal = Calendar.getInstance();
                int year = cal.get(Calendar.YEAR);
                int age = year - birthday / 10000;
                String sql = "INSERT INTO Person(time,num,birthday,name,age,city,tel) VALUES (NOW(),?,?,?,?,?,?)";
                st = conn.prepareStatement(sql);        //预编译
                st.setInt(1, i);
                st.setInt(2, birthday);
                st.setString(3, getName());
                st.setInt(4, age);
                st.setString(5, getCity());
                st.setString(6, getTel());

                st.executeUpdate();
            }
            System.out.println("完成");
            st.close();
            conn.close();
        } catch (Exception e) {
            System.out.println(e);
            e.printStackTrace();
        }
    }

    //随机出生日期
    private static int Birthday() {
        int start = 1961;
        int end = 2001;
        Calendar birthday = Calendar.getInstance();
        birthday.set(Calendar.YEAR, (int) (Math.random() *(end-start+1))+start);
        birthday.set(Calendar.MONTH, (int) (Math.random() * 12));
        birthday.set(Calendar.DATE, (int) (Math.random() * 31));

        StringBuilder builder = new StringBuilder();
        builder.append(birthday.get(Calendar.YEAR));
        long month = birthday.get(Calendar.MONTH) + 1;
        if (month < 10) {
            builder.append("0");
        }
        builder.append(month);
        long date = birthday.get(Calendar.DATE);
        if (date < 10) {
            builder.append("0");
        }
        builder.append(date);
        return Integer.parseInt(builder.toString());
    }


    //随机城市
    private static String getCity(){
        String[] address = {"北京","上海","广州","西安","重庆","南京","拉萨","大理","成都","深圳",
                "天津","烟台","呼和浩特","武汉","长沙","杭州","苏州","香港","郑州","大连"};
        int a = (int) (Math.random()*10);
        return address[a];
    }

    //随机电话
    private static String getTel() {
        String[] telFirst="134,135,136,137,138,139,150,151,152,157,158,159,130,131,132,155,156,133,153".split(",");
        int index=getNum(0,telFirst.length-1);
        String first=telFirst[index];
        String second=String.valueOf(getNum(1,888)+10000).substring(1);
        String third=String.valueOf(getNum(1,9100)+10000).substring(1);
        return first+second+third;
    }
    public static int getNum(int start,int end)
    {
        return (int)(Math.random()*(end-start+1)+start);
    }

    //随机姓名
    public static String getName() {
        Random random = new Random();
        String[] Surname = { "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许",
"何","吕","施","张","孔","曹","严","华","金","魏","陶","姜","戚","谢","邹","喻","柏","水","窦","章"};

        int index = random.nextInt(Surname.length - 1);
        String name = Surname[index]; // 获得一个随机的姓氏
        /* 从常用字中选取一个或两个字作为名 */
        if (random.nextBoolean()) {
            name += RandomPerson.getChinese() + RandomPerson.getChinese();
        } else {
            name += RandomPerson.getChinese();
        }
        return name;
    }
    public static String getChinese() {
        String str = null;
        int highPos, lowPos;
        Random random = new Random();
        highPos = (176 + Math.abs(random.nextInt(71)));// 区码,0xA0打头,从第16区开始,即0xB0=11*16=176,16~55一级汉字,56~87二级汉字
        random = new Random();
        lowPos = 161 + Math.abs(random.nextInt(94));// 位码,0xA0打头,范围第1~94列
        byte[] bArr = new byte[2];
        bArr[0] = (new Integer(highPos)).byteValue();
        bArr[1] = (new Integer(lowPos)).byteValue();
        try {
            str = new String(bArr, "GB2312"); // 区位码组合成汉字
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return str;
    }

插入数据时,可变换这方式插入,例如增加延时,编写多条插入的sql语句

Thread.sleep(100);		//延时