精华内容
下载资源
问答
  • 2020-07-06 09:16:16

    语言虽然有自己的数据库, 但易数据库只是以简单的、类似表格的形式组织数据信息,是一个小型数据库管理系统。有时编程中必须使用其它数据库。易语言支持以ODBC方式和ADO方式操作外部数据库。

    一、ODBC与ADO
    (1)ODBC简介
    ODBC(Open Database Connectivity,开放式数据库互联),是目前国际上通用的数据库访问标准,是微软公司开放服务结构中的组成部分,提供了一个对数据库访问的标准API(应用程序编程接口),这些API利用SQL语言完成大部分任务。
    ODBC的最大优点是能以统一的方式处理所有的数据库。
    ODBC不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。客户应用程序连接ODBC数据源,ODBC数据源通过ODBC驱动管理器与特定的ODBG驱动程序联系起来,然后通过此ODBC驱动程序访问本地或远程数据库。
    ODBC数据源又叫DSN,它把客户应用程序、数据库、用户名、密码等信息组合起来,供客户端程序使用。
    在WindowsXP系统,可通过“控制面板”——“管理工具”——“数据源(ODBC)”配置ODBC数据源
    (2)ADO简介
    ADO (ActiveX Data Objects,数据对象) ,是微软公司的一个用于存取数据源的COM组件,用以实现访问关系或非关系数据库中的数据。
    ADO是面向对象的编程接口,是编程语言和统一数据访问方式OLE DB的一个中间层。可以为任何数据源提供高性能的访问,并允许开发人员编写访问数据的代码,而不用关心数据库是如何实现的,只需要关心数据库的连接。
    ADO是对当前微软所支持的数据库进行操作的最有效和最简单直接的命令,是功能强大的数据访问编程模式,从而使大部分数据源可编程的属性得以扩展。
    ADO方式操作数据库比ODBC方式操作数据库效率更高。
    二、外部数据库组件
    (1)“外部数据提供者”组件和“外部数据库”组件
    易语言核心支持库中的“外部数据提供者”组件和“外部数据库”组件,封装了以ODBC方式访问数据库的标准接口,可以直接将外部数据库绑定到ODBC数据源,并对外部数据库进行操作。
    (2)“数据库连接”组件和“记录集”组件
    数据库操作支持库中的“数据库连接”组件和“记录集”组件,封装了以ADO方式访问数据库的标准接口,使用ADO方式对外部数据库进行操作。
    (3)MySQL支持库
    MySQL支持库可以对MySQL数据库系统进行操作。MySQL数据库是一个大型关系型数据库管理系统,性能高,运行速度快,操作简单,并且支持Linux操作系统,因此成为跨平台的数据库首选 工具。
    (4)Sqlite数据库支持库
    Sqlite数据库支持库可能对 Sqlite数据库进行操作。Sqlite数据库是一个小型关系型数据库,跨平台,支持SQL语句、事务、触发器、视图,速度快,小巧且不依赖任何驱动程序。Sqlite数据库是本地数据库,不支持网络传输。
    Sqlite数据库是一个小型关系型文件数据库;跨平台;支持SQL语句、事务、触发器、视图;速度相当快;小巧且不依赖任何额外的驱动程序。Sqlite数据库是本地数据库,不是网络数据库。
    相对于易语言数据库,Sqlite数据库的优势是支持SQL语句、事务、触发器、视图;
    相对于Microsoft Access,Sqlite数据库的优势是跨平台、无需额外驱动;
    相对于其它非本地数据库,如Oracle、DB2、MS SQL Server、MySQL、PostgreSQL,Sqlite数据库具有小巧、速度快的优势。
    内部使用的Sqlite版本是3.2.5。本支持库将只为向后兼容而存在,不会再有版本升级,推荐使用“Sqlite3数据库支持库”。
    本库为一般支持库,需要易系统3.7版本的支持,需要系统核心支持库3.7版本的支持,提供了10种库定义数据类型,提供了230种命令。
    三、SQL Server数据库和Access数据库
    可供易语言使用的数据库很多,大型的数据库有:SQL Server、Oracle、Sybase、DB2、MySQL等,小型的数据库有:Access、FoxPro、Sqlite等。下面简单了解兼容性好、使用频率高的SQL Server数据库和Access数据库。
    (1)SQL Server数据库
    SQL Server是一个大型关系数据库管理系统,最初是由Microsoft、Sybase 和Ashton-Tate三家公司共同开发的,于1988 年推出了第一个OS/2 版本。后来Microsoft独自开发了SQL Server几个版本,如:SQL Server 2000,SQL Server 2005,SQL Server 2008,还有免费版本SQL Server Express。
    SQL Server是一个全面的数据库平台,使用集成的商业智能 (BI) 工具提供了企业级的数据管理,数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,可以构建和管理用于业务的高可用和高性能的数据应用程序。
    SQL Server具有使用方便、可伸缩性好、与相关软件集成程度高等优点,结合了分析、报表、集成和通知功能,有着灵活的实现方式,允许选择最适合的解决方案。数据库类型
    (2)Access数据库
    Access是一个小型关系数据库,是Microsoft的Office软件包中的一个组件。现在流行的版本有:Access 2000,Access 2003,Access 2007等。
    Access数据库具有界面友好、易学易用、开发简单、接口灵活的特点。
    Access数据库由一系列表组成,表又由一系列行和列组成,每一行是一个记录,每一列是一个字段,每个字段有一个字段名。
    Access 2003数据库由七种对象组成,它们是表、查询、窗体、报表、宏、页和模块。
    1、易(.edb)
    2、Access(.mdb)
    3、MySql
    提供了2种库定义数据类型,提供了53种命令,提供了57个库定义常量
    四、Sqlite数据库支持库
    五、本地数据库,网络数据库
    本地数据库就是和调用程序同在一台电脑上的数据库。
    网络数据库(远程数据库),需要网络远程链接,于调用程序不在同一台电脑上。
    本地数据库就是本地一个文件,程序直接访问,基本服务的数据库需要有一个数据库服务来提供访问服务

    源码:511遇见易语言教程

               511遇见易语言教程视频链接

               511遇见教程-易语言外部数据库应用

    更多相关内容
  • 易语言外部数据库使用
  • 主要介绍了android打包安装时加入外部数据库的示例,需要的朋友可以参考下
  • 依据条件动态生成sql语句,执行查询,包括模糊查询。
  • 通用连接access,,通用连接sql,连接access,连接sql,添加,删除,保存到XML,保存到ADTG,断开连接。 三叶自学网
  • 完整版外部数据库.rar

    2020-04-02 13:06:28
    完整版外部数据库.rar
  • 仅用核心支持库实现对外部数据库的操作ADODB操作外部数据库例程 系统结构:根据村组查询数据,数据库_读取数据到高级表格,数据库_保存高级表格数据到数据库,数据库_读取数据到列表框
  • 易语言外部数据库使用 告诉你如何使用外部数据库,请下载
  • 在各个博客网站查询了很多方法,虽然能够导入,但是表是空的,个人判断是外部数据库类型(如后缀为db,sql)的原因,改为sqlite类型的数据库就可以正常导入所有外部数据库的信息了,以下是导入的几个步骤: ...

    在各个博客网站查询了很多方法,虽然能够导入,但是表是空的,个人判断是外部数据库类型(如后缀为db,sql)的原因,改为sqlite类型的数据库就可以正常导入所有外部数据库的信息了,以下是导入的几个步骤:

    方法一是使用虚拟机的目录的upload方法直接导入,具体步骤去查其他博主的吧,这里主要讲使用代码来写入外部的数据库:

    在这里插入图片描述

    方法二,代码导入:
    1.创建外部数据库和数据表:

    在这里插入图片描述
    并把该数据库放到项目中的assets或者raw这两个目录中(自行创建的目录)
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/944d682a2fec453fa1986aaa282abc36.png在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    2.创建IO流的封装类来写入数据库:

    public class NationOpenDB {
        private final int BUFFER_SIZE = 400000;
        public static final String DB_BANE = "nations.sqlite";//保存的数据库文件名称
        public static final String PACKAGE_NAME = "com.example.test2";//应用的包名
        public static final String DB_PATH = "/data" + Environment.getDataDirectory().getAbsolutePath() + "/"
                + PACKAGE_NAME + "/databases";//在手机里存放数据库的位置
        private Context context;//组件的上下文
    
        public NationOpenDB(Context context) {
            this.context = context;
        }
        public SQLiteDatabase openDatabase(){
            try {
                File myDataPath = new File(DB_PATH);
                if (!myDataPath.exists()) {
                    myDataPath.mkdirs();
                }
                String dbFile = myDataPath + "/" + DB_BANE;
                if (!(new File(dbFile).exists())) {
                    InputStream is = context.getAssets().open(DB_BANE);
                    //InputStream is = context.getResources().openRawResource(R.raw.nations);
                    FileOutputStream fos = new FileOutputStream(dbFile);
                    byte[] buffer = new byte[BUFFER_SIZE];
                    int count = 0;
                    while ((count = is.read(buffer)) !=-1) {
                        Log.e("test2", "写入"+String.valueOf(count));
                        fos.write(buffer, 0, count);
                    }
                    fos.flush();
                    fos.close();
                    is.close();
                }
    
                SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
                return db;
            } catch (FileNotFoundException e) {
                Log.e("test2", "File not found!");
                e.printStackTrace();
            } catch (IOException e) {
                Log.e("test2", "IO exception");
                e.printStackTrace();
            }
            Log.e("test2", "没有??!");
            return null;
        }
    }
    

    注意这些成员变量:DB_NAME(使用sqlite文件类型的数据库),PACKAGE_NAME(应用包名)

    3.创建存储各条数据的实体类和实现测试

    public class Nations {
        public Integer id;
        public String nation;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getNation() {
            return nation;
        }
    
        public void setNation(String nation) {
            this.nation = nation;
        }
    }
    
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            NationOpenDB nation = new NationOpenDB(this);
            List<Nations> nationList = new ArrayList<Nations>();
            SQLiteDatabase sqLiteDatabase = nation.openDatabase();
            Cursor cursor = sqLiteDatabase.rawQuery("select *from china_nations", null);
            //Cursor cursor = sqLiteDatabase.query("china_nations", new String[]{"id", "nation"}, null, null, null, null, null);
            Log.e("test2", "cursor:" + String.valueOf(cursor.getCount()));
            while (cursor.moveToNext()) {
                Nations nations = new Nations();
                Integer id = cursor.getInt(cursor.getColumnIndex("id"));
                String nationName = cursor.getString(cursor.getColumnIndex("nation"));
                nations.setId(id);
                nations.setNation(nationName);
                nationList.add(nations);
            }
            for (Nations nations1 : nationList) {
                Log.e("test2",nations1.id + " " + nations1.nation);
            }
        }
    

    4.Log结果
    在这里插入图片描述

    展开全文
  • 易语言之外部数据库使用.docx易语言之外部数据库使用.docx易语言之外部数据库使用.docx易语言之外部数据库使用.docx易语言之外部数据库使用.docx易语言之外部数据库使用.docx易语言之外部数据库使用.docx易语言之...
  • 易语言之外部数据库使用.pdf易语言之外部数据库使用.pdf易语言之外部数据库使用.pdf易语言之外部数据库使用.pdf易语言之外部数据库使用.pdf易语言之外部数据库使用.pdf易语言之外部数据库使用.pdf易语言之外部数据库...
  • ADO类使用例程ADODB操作外部数据库例程 系统结构:根据村组查询数据,数据库_读取数据到高级表格,数据库_保存高级表格数据到数据库,数据库_读取数据到列表框,高级表格_填充行号及交替
  • 易语言模块外部数据库.rar
  • 4、重新发布业务单元“用户自定义/通用/数据库/外部第三方数据库/外部数据库”; 5、刷新java代码; 6、启动测试... 操作步骤: 1、用 administrator 账户登录EAS; 2、打开“币别”界面并单击帮助下的关于菜单进行...
  • 在某些特殊的情况下需要调用外部数据库,有些新手朋友对此还是很疑惑的,下面是具体的实现标签,感兴趣的朋友可以参考下
  • 易语言3.6版外部数据库使用
  • 外部数据库.zip易语言程序源码资源下载外部数据库.zip易语言程序源码资源下载 1.适合学生毕业设计用 2.适合程序员学习研究用 3.适合新手自学研究使用
  • Linux下设置MySQL和允许外部机器访问sudo vi /etc/my.cnf 具体目录是具体情况而定,有的人是安装了在个人目录下,则找到对应的目录则可以。 一、配置文件的修改 1.#sudo vim /etc/mysql/my.conf 找到 bind-address =...
  • android应用,将外部的sqlite数据库导入到应用的私有空间中,源db文件置于assets目录下,如果源文件大小超过1M,使用Filesplit分割为不超过1M的小文件,那么就将所有分小文件置于assets目录下,本工程已带...
  • 易语言外部数据库使用.zip易语言项目例子源码下载易语言外部数据库使用.zip易语言项目例子源码下载 1.合个人学习技术项目参考 2.适合学生毕业设计参考 3.适合小团队开发项目参考
  • 本实例主要练习了ADO.Net连接到外部数据库的基础上,向查询中添加参数。使用的是ACCESS数据库
  • 易语言教程..... ODBC连接外部数据库....
  • 易语言SQL语句操作数据库源码,SQL语句操作数据库,初始化表名,格式化表格,格式化表格1,改变查询文本,初始化国籍,格式化表格3,打开外部数据库,取得链接文本,创建链接文件,创建链接文本,外部数据库查询,外部数据库删除...
  • harbor配置外部数据库

    千次阅读 2020-04-09 10:53:53
    harbor默认安装会使用官方打包的PostgreSQL docker镜像goharbor/harbor-db,harbor启动之后的数据均存放在改数据库上,后续管理可能存在不便,故使用harbor配置外部数据库。 一、搭建PostgreSQL数据库 ​ harbor从...

    同时发布于schnappi618’s blog


    harbor默认安装会使用官方打包的PostgreSQL docker镜像goharbor/harbor-db,harbor启动之后的数据均存放在改数据库上,后续管理可能存在不便,故使用harbor配置外部数据库。

    一、搭建PostgreSQL数据库

    ​ harbor从1.6版本之后仅支持PostgreSQL数据库作为外部数据库,故需要搭建PostgreSQL数据库使用。这里目前作为测试,故仅安装了单节点,未配置主从,搭建步骤如下:

    1. 安装

    - 系统版本:CentOS7
    
    ## 1. 安装依赖包
    yum install -y cmake gcc gcc-c++ perl readline readline-devel openssl openssl-devel zlib zlib-devel ncurses-devel readline readline-devel zlib zlib-devel
    
    ## 2. 源码安装PostgreSQL
    [postgres@xxxx dba]$ wget https://ftp.postgresql.org/pub/source/v12.2/postgresql-12.2.tar.gz
    [postgres@xxxx dba]$ tar zxf postgresql-12.2.tar.gz 
    [postgres@xxxx dba]$ cd postgresql-12.2
    [postgres@xxxx postgresql-12.2]$ ./configure --prefix=/usr/local/postgresql
    [postgres@xxxx postgresql-12.2]$ make && make install
    ### 这里configure的时候制定了安装目录,故需要将该目录下的bin目录写入到环境变量中去,以方便后面直接使用,也可不指定,安装到默认路径下
    

    2. 配置

    # 1. 创建数据目录
    [postgres@xxxx data]$ mkdir -p /work/harbor-db/data
    # 2. 创建日志目录
    [postgres@xxxx data]$ mkdir -p /work/harbor-db/log
    # 3. 创建socket目录
    [postgres@xxxx data]$ mkdir -p /work/harbor-db/tmp
    # 4. 授权
    [postgres@xxxx data]$ chown -R postgres.postgres /work/harbor-db/
    # 5. 初始化pg实例
    [postgres@xxxx data]$ initdb --username=postgres -D /work/harbor-db/data/
     
    ## 这里PostgreSQL数据库与harbor并未在同一台主机上,故除了修改配置文件postgresql.conf外还需要修改客户端认证配置pg_hba.conf文件,若在同一台主机上没有网络以及认证需求的话,可以不修改
    # 6. 根据需要修改初始化的配置文件,修改位置如下:
    [postgres@xxxx data]$ vim /work/harbor-db/data/postgresql.conf
     # 数据目录指定
    data_directory = '/work/harbor-db/data'
     # 客户端可连接ip,默认为localhost,若不需要可不修改,*为所有
    listen_addresses = '*'
     # 端口设置
    port = 7002
     # 允许最大连接数
    max_connections = 100
     # socket目录及权限设置
    unix_socket_directories = '/work/harbor-db/tmp'
    unix_socket_group = ''
    unix_socket_permissions = 0777
     # 内存大小
    shared_buffers = 128MB
     # 时区修改
    timezone = 'Asia/Shanghai'
     
     # 日志:
     ## 是否开启日志
    logging_collector = on
     ## 日志存放目录
    log_directory = '/work/harbor-db/log'
     ## 每个日志最大size
    log_rotation_size = 1GB
     ## 日志时区
    log_timezone = 'Asia/Shanghai'
     ## 记录执行时间大于100ms的sql及执行时间,相当于慢SQL日志
    log_min_duration_statement = 100
    
    ## 由于这里需要远程可以连接,所以需要添加认证配置pg_hba.conf,根据自己需求配置,若不需要的话可不配置该文件
    [postgres@xxxx data]$ vim pg_hba.conf 
    # 在文件末尾添加,以下配置表示,允许ADDRESS对应的主机,通过harbor用户访问该库的所有数据库
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    host    all             harbor             x.x.x.x/x           trust
    

    3. 启动

    [postgres@xxxx data]$ su - postgres
    ## 启动方式使用以下1种即可
    [postgres@xxxx data]$ pg_ctl -D /work/harbor-db/data/ -l /work/harbor-db/log/start.log start
    
    或使用 postgres -D /work/harbor-db/data > /work/harbor-db/log/start.log 2>&1 & 命令启动
    

    4. 登陆测试

    ## 1. 本地测试
    # 安装完成后会有postgres用户,相当于MySQL的root用户,默认没有密码
    [postgres@xxxx data]$ psql -h 127.0.0.1 -p 7002 -U postgres
    psql (12.2)
    Type "help" for help.
    ### 修改postgres用户的密码
    postgres=# \password postgres
    Enter new password: 
    Enter it again: 
    ### 创建harbor用户,并创建harbor所涉及数据库及进行授权
    postgres=# create user harbor with password 'harbor123';
    CREATE ROLE
    postgres=# CREATE DATABASE harbor;
    CREATE DATABASE
    postgres=# create database harbor_clair;
    CREATE DATABASE
    postgres=# create database harbor_notary_server;
    CREATE DATABASE
    postgres=# create database harbor_notary_signer; 
    CREATE DATABASE
    postgres=# GRANT ALL PRIVILEGES ON DATABASE harbor to harbor;           
    GRANT
    postgres=# GRANT ALL PRIVILEGES ON DATABASE harbor_clair to harbor;           
    GRANT
    postgres=# GRANT ALL PRIVILEGES ON DATABASE harbor_notary_server to harbor;            
    GRANT
    postgres=# GRANT ALL PRIVILEGES ON DATABASE harbor_notary_signer to harbor;                    
    GRANT
    
    ## 2. 远程主机harbor用户测试
    [root@remote harbor]# psql -h x.x.x.x -p 7002 -U harbor -W 
    Password: 
    psql (12.2)
    Type "help" for help.
    
    harbor=> 
    

    ​ 至此,PostgreSQL数据库及基础配置设置完毕。

    二、Harbor配置

    1. 配置文件修改

    [root@remote harbor]# vim harbor.yml
    # Uncomment external_database if using external database.
    external_database:
      harbor:
        host: x.x.x.x
        port: 7002
        db_name: harbor
        username: harbor
        password: xxxxxxxx
        ssl_mode: disable
        max_idle_conns: 50
        max_open_conns: 100
      clair:
        host: x.x.x.x
        port: 7002
        db_name: harbor_clair
        username: harbor
        password: xxxxxxxx
        ssl_mode: disable
      notary_signer:
        host: x.x.x.x
        port: 7002
        db_name: harbor_notary_signer
        username: harbor
        password: xxxxxxxx
        ssl_mode: disable
      notary_server:
        host: x.x.x.x
        port: 7002
        db_name: harbor_notary_server
        username: harbor
        password: xxxxxxxx
    

    2. docker-compose文件修改

    ​ 设置了外部数据库之后,便不再需要harbor本身的harbor-db镜像来支持,由安装重启文件install.sh可看出最终的安装等操作都由docker-compose.yml文件来完成,故需要在docker-compose文件中删除或注释掉harbor-db相关,修改完成后执行sh install.sh文件重启harbor服务即可。

    三、测试验证

    1. 数据库验证

    ​ 当harbor服务重启完成后,进入外部数据库中会发现刚才配置的库里面有了harbor的一些相关表。

    [root@remote harbor]# psql -h x.x.x.x -p 7002 -U harbor -W 
    Password: 
    psql (12.2)
    Type "help" for help.
    # 查看有哪些库
    harbor=> \l
                                           List of databases
             Name         |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
    ----------------------+----------+----------+-------------+-------------+-----------------------
     harbor               | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres         +
                          |          |          |             |             | postgres=CTc/postgres+
                          |          |          |             |             | harbor=CTc/postgres
     harbor_clair         | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres         +
                          |          |          |             |             | postgres=CTc/postgres+
                          |          |          |             |             | harbor=CTc/postgres
     harbor_notary_server | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres         +
                          |          |          |             |             | postgres=CTc/postgres+
                          |          |          |             |             | harbor=CTc/postgres
     harbor_notary_signer | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres         +
                          |          |          |             |             | postgres=CTc/postgres+
                          |          |          |             |             | harbor=CTc/postgres
     postgres             | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
     template0            | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
                          |          |          |             |             | postgres=CTc/postgres
     template1            | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
                          |          |          |             |             | postgres=CTc/postgres
    (7 rows)
    # 进入harbor库中
    harbor=> \c harbor
    Password for user harbor: 
    You are now connected to database "harbor" as user "harbor".
    # 查看该库有哪些表
    harbor=> \dt
                     List of relations
     Schema |           Name           | Type  | Owner  
    --------+--------------------------+-------+--------
     public | access                   | table | harbor
     public | access_log               | table | harbor
     public | admin_job                | table | harbor
     public | alembic_version          | table | harbor
     public | artifact                 | table | harbor
     public | artifact_blob            | table | harbor
     public | blob                     | table | harbor
     public | cve_whitelist            | table | harbor
     public | harbor_label             | table | harbor
     public | harbor_resource_label    | table | harbor
     public | harbor_user              | table | harbor
     public | immutable_tag_rule       | table | harbor
     public | job_log                  | table | harbor
     public | notification_job         | table | harbor
     public | notification_policy      | table | harbor
     public | oidc_user                | table | harbor
     public | project                  | table | harbor
     public | project_blob             | table | harbor
     public | project_member           | table | harbor
     public | project_metadata         | table | harbor
     public | properties               | table | harbor
     public | quota                    | table | harbor
     public | quota_usage              | table | harbor
     public | registry                 | table | harbor
     public | replication_execution    | table | harbor
     public | replication_policy       | table | harbor
     public | replication_schedule_job | table | harbor
     public | replication_task         | table | harbor
     public | repository               | table | harbor
     public | retention_execution      | table | harbor
     public | retention_policy         | table | harbor
     public | retention_task           | table | harbor
     public | robot                    | table | harbor
     public | role                     | table | harbor
     public | scan_report              | table | harbor
     public | scanner_registration     | table | harbor
     public | schedule                 | table | harbor
     public | schema_migrations        | table | harbor
     public | user_group               | table | harbor
    (39 rows)
    
    ## 由于并没有开启其他三个组件的功能,所以其他三个库里面没有表,当harbor库中有表存在后,则外部数据库配置成功
    

    2. Web页面测试

    ​ 根据之前的harbor搭建中最后的web页面创建镜像仓库的演示,可新创建一个镜像仓库,并上传一个镜像,完成后,在数据库中可看到记录

    harbor_notary_signer=> \c harbor
    Password for user harbor: 
    You are now connected to database "harbor" as user "harbor".
    # 查看操作日志,创建了一个pingcap仓库,并上传了一个tikv:v3.0.12的镜像到pingcap仓库中,所有的操作均为admin用户执行
    harbor=> select * from access_log;
     log_id | username | project_id |  repo_name   | repo_tag | guid | operation |          op_time           
    --------+----------+------------+--------------+----------+------+-----------+----------------------------
          1 | admin    |          2 | pingcap/     | N/A      |      | create    | 2020-04-08 18:02:50.369493
          2 | admin    |          2 | pingcap/tikv | v3.0.12  |      | push      | 2020-04-08 18:03:48.824079
    (2 rows)
    # 查看目前有哪些仓库,即project
    harbor=> select * from project;   
     project_id | owner_id |  name   |       creation_time        |        update_time         | deleted 
    ------------+----------+---------+----------------------------+----------------------------+---------
              1 |        1 | library | 2020-04-08 17:48:10.024358 | 2020-04-08 17:48:10.024358 | f
              2 |        1 | pingcap | 2020-04-08 18:02:50        | 2020-04-08 18:02:50        | f
    (2 rows)
    # 查看目前有哪些镜像
    harbor=> select * from repository;
     repository_id |     name     | project_id | description | pull_count | star_count |       creation_time        |        update_t
    ime         
    ---------------+--------------+------------+-------------+------------+------------+----------------------------+----------------
    ------------
                 1 | pingcap/tikv |          2 |             |          0 |          0 | 2020-04-08 18:03:48.824717 | 2020-04-08 18:0
    3:48.824717
    (1 row)
    

    ​ 可以看到,所有的结果均符合预期,harbor配置外部数据库及测试完成。_

    展开全文
  • 易语言模块树型框附加模块-外部数据库版.rar 易语言模块树型框附加模块-外部数据库版.rar 易语言模块树型框附加模块-外部数据库版.rar 易语言模块树型框附加模块-外部数据库版.rar 易语言模块树型框附加模块-...
  • SAP abap 链接外部数据库的实现方法
  • 源码使用易语言外部数据库组件操作SQLserver数据库,支持数据库的附加、分离、备份、恢复等功能。
  • 本文介绍了如何通过PostgreSQL扩展模块postgres_fdw实现跨库访问,也就是在一个数据库中访问外部的其他PostgreSQL数据库。具体步骤如下:使用CREATE EXTENSION命令安装postgres_fdw模块;使用CREATE SERVER命令创建...

    fdw

    大家好,我是只谈技术不剪发的 Tony 老师。在某些情况下,例如数据仓库的 ETL 流程中,我们可能需要从一个 PostgreSQL 服务器访问另一个远程 PostgreSQL 服务器中的数据。为此,PostgreSQL 提供了一个扩展的模块:postgres_fdw。今天我们就来介绍一下这个模块的使用方法和案例。

    如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁

    postgres_fdw 简介

    postgres_fdw 是基于 SQL/MED 标准开发的一个外部数据封装器(Foreign Data Wrapper),可以用于访问外部 PostgreSQL 服务器,对远程数据表执行 SELECT、INSERT、UPDATE 以及 DELETE 操作。

    与 postgres_fdw 类似的另一个扩展模块是 dblink。它们的功能基本相同,但是 postgres_fdw 提供了更透明且符合标准的语法来访问远程表,并且在很多情况下可以提供更好的性能。postgres_fdw 可以支持的远程服务器最低版本为 PostgreSQL 8.3,如果是只读访问则可以支持到 PostgreSQL 8.1。

    通过 postgres_fdw 访问远程数据表的步骤如下:

    1. 使用CREATE EXTENSION命令安装 postgres_fdw 模块;
    2. 使用CREATE SERVER命令创建一个外部服务器对象,该对象代表了想要连接的远程数据库;
    3. 使用CREATE USER MAPPING命令为本地用户创建一个远程用户映射;
    4. 使用CREATE FOREIGN TABLE或者IMPORT FOREIGN SCHEMA语句为每个远程数据库中的表创建一个外部表。

    然后,就可以通过查询外部表访问远程表中的数据,包括 SELECT、INSERT、UPDATE 以及 DELETE 操作(当然,用户映射时指定的远程用户必须拥有这些表上的相应权限)。接下来我们就通过一个实际案例介绍如何实现以上步骤。

    📝除了 postgres_fdw,PostgreSQL 还支持访问各种数据源的外部数据封装器,包括 Oracle、MySQL、SQL Server、SQLite 等关系型数据库,MongoDB、Redis、Neo4j、Cassandra 等 NoSQL 数据库,CSV、XML、JSON 等文件,Elasticsearch、Hive、HBase 等大数据平台等等,具体可以参考 PostgreSQL Wiki

    postgres_fdw 安装

    首先,我们需要安装 postgres_fdw 模块。对于 Linux 操作系统,可以通过 postgresql-contrib 软件包下载 PostgreSQL 扩展模块;对于 Windows 和 macOS,默认安装已经包含了扩展模块。我们只需要执行以下语句在当前数据库中安装 postgres_fdw 模块:

    CREATE EXTENSION postgres_fdw;
    

    创建外部服务器对象

    然后,使用 CREATE SERVER 语句创建一个外部服务器(foreign server)。例如:

    CREATE SERVER foreign_server
    FOREIGN DATA WRAPPER postgres_fdw
    OPTIONS (host '192.168.56.104', port '5432', dbname 'pagila');
    

    其中,foreign_server 是我们指定的外部服务器名称;host 参数是远程服务器的地址,示例中为 192.168.56.104;port 参数是远程服务器的端口,示例中为 5432;dbname 参数是远程数据库的名称,示例中为 pagila。

    📝关于 CREATE SERVER 语句的详细介绍,可以参考官方文档

    创建用户映射

    下一步,使用 CREATE USER MAPPING 语句创建一个用户映射(user mapping),为本地用户指定一个访问远程服务器时的角色。例如:

    CREATE USER MAPPING FOR postgres
    SERVER foreign_server
    OPTIONS (user 'tony', password 'pswd123#');
    

    以上语句为本地 postgres 用户创建了一个访问远程服务器 foreign_server 时的用户映射,也就是使用用户名 tony 和密码 pswd123# 连接远程服务器。

    📝关于 CREATE USER MAPPING 语句的详细介绍,可以参考官方文档

    创建外部表

    然后,使用 CREATE FOREIGN TABLE 语句创建一个外部表(foreign table)。例如:

    CREATE FOREIGN TABLE country (
        country_id int NOT NULL,
    	country varchar(50) NOT NULL,
    	last_update timestamp NOT NULL
    )
    SERVER foreign_server
    OPTIONS (schema_name 'public', table_name 'country');
    

    以上示例在本地数据库中创建了一个名为 country 的外部表,对应的是远程服务器 foreign_server 中 public 模式下的 country 表。

    通常来说,推荐创建外部表时使用和远程表一致的数据类型以及可能的排序规则。虽然目前 postgres_fdw 支持各种类型转换,远程服务器和本地服务器解析 WHERE 子句的细微差别可能会导致意外的语义异常。

    另外,外部表的字段个数可以少于远程表,字段顺序也可以不同;因为字段的映射是通过名称而不是字段位置实现。

    📝关于 CREATE FOREIGN TABLE 语句的详细介绍,可以参考官方文档
    📝另一种创建外部表的方法是使用 IMPORT FOREIGN SCHEMA 语句实现批量导入,具体参考官方文档

    访问远程数据表

    现在,我们可以在本地数据库中通过外部表访问对应的远程表。例如:

    SELECT * 
    FROM country
    LIMIT 5;
    country_id|country       |last_update        |
    ----------|--------------|-------------------|
             1|Afghanistan   |2006-02-15 09:44:00|
             2|Algeria       |2006-02-15 09:44:00|
             3|American Samoa|2006-02-15 09:44:00|
             4|Angola        |2006-02-15 09:44:00|
             5|Anguilla      |2006-02-15 09:44:00|
    

    除了查询操作,postgres_fdw 同样可以通过 DML 语句修改远程表中的数据。对于 INSERT 语句,目前还不支持 ON CONFLICT DO UPDATE 子句;但是可以使用省略了冲突条件的 ON CONFLICT DO NOTHING 子句。例如:

    INSERT INTO country VALUES (109, 'Zambia', '2006-02-15 09:44:00')
    ON CONFLICT DO NOTHING;
    

    另外,虽然 postgres_fdw 支持对分区表执行导致数据行移动的 UPDATE 语句;但是如果远程分区既是行移动的目标分区,又是更新操作的目标分区时,UDATE 语句无法执行。

    postgres_fdw 选项

    在使用 postgres_fdw 创建外部服务器、用户映射以及外部表等对象时,可以通过 OPTIONS 指定一些选项设置不同的行为。

    连接选项

    通过 postgres_fdw 创建远程服务器时的选项和 libpq 连接字符串相同,但是不支持以下选项:

    • userpassword(这两个选项可以在创建用户映射时指定);
    • client_encoding(自动使用本地服务器编码进行设置);
    • fallback_application_name(默认设置为 postgres_fdw)。

    只有超级永远可以不通过密码认证连接远程服务器,所以为普通用户创建用户映射时不要忘记指定 password 选项。

    对象名称选项

    以下选项可以用于控制发送给远程服务器的 SQL 语句中使用的对象名称,只有当外部表定义中的名称和远程表的名称不一致时才需要指定:

    • schema_name,该选项在创建外部表时指定,表示远程表所在的模式;如果省略,默认使用外部表所在的模式名。
    • table_name,该选项在创建外部表时指定,表示远程表的名称;如果省略,默认使用外部表的名称。
    • column_name,该选项在定义外部表的字段名时指定,表示对应远程表中的字段名;如果省略,默认使用外部表的字段名称。

    例如,以下语句重新创建了外部表 country:

    DROP FOREIGN TABLE IF EXISTS country;
    
    CREATE FOREIGN TABLE country (
        id int OPTIONS (column_name 'country_id') NOT NULL,
    	country varchar(50) NOT NULL,
    	last_update timestamp NOT NULL
    )
    SERVER foreign_server;
    

    首先,外部表 country 中的 id 字段和远程表的 country_id 字段名称不同,需要使用 OPTIONS 选项指定名称映射;其次,外部表 country 定义中没有指定 schema_name 和 table_name 选项,表示使用该表在本地数据库中的模式名(public)和表名(country)访问远程表。

    成本评估选项

    postgres_fdw 通过在远程服务器中执行查询语句返回数据,因此理想情况下扫描外部表的评估成本等于远程服务器执行操作的成本加上网络传输成本。获取这个评估成本最可靠的方法就是询问远程服务器并加上一些额外的消耗,但是对于简单查询语句,没有必要为此执行一次额外的远程查询。所以 postgres_fdw 提供了以下用于成本评估的额选项:

    • use_remote_estimate,用于控制 postgres_fdw 是否提交远程 EXPLAIN 命令获取评估成本。该选项支持外部表和外部服务器级别的设置,外部表的设置优先级更高。默认设置为 false。
    • fdw_startup_cost,表示建立连接、远程服务器解析查询和创建执行计划所需的额外成本。该选项支持外部服务器级别的设置,任何外部表的扫描都需要加上这个额外的启动成本。默认值为 100。
    • fdw_tuple_cost,表示服务器之间传输一行数据所需的额外成本。该选项支持外部服务器级别的设置,可以根据网络延迟的情况设置不同的参数。默认值为 0.01。

    如果 use_remote_estimate 设置为 true,postgres_fdw 从远程服务器获取行数和成本评估,然后加上 fdw_startup_cost 和 fdw_tuple_cost;如果 use_remote_estimate 设置为 false,postgres_fdw 执行本地行数和成本评估,然后加上 fdw_startup_cost 和 fdw_tuple_cost。

    本地评估通常不太准确,除非本地存储了远程表的统计信息。诊断外部表执行 ANALYZE 命令可以更新本地统计,该命令会对远程表执行扫描并计算和存储统计信息。保存本地统计可以有效减少访问远程表时的额外成本,但是如果远程表的更新很频繁,本地统计很快就会失效。

    远程执行选项

    默认情况下,只有 WHERE 子句中的内置操作符和函数可能会在远程服务器中执行,非内置函数在返回数据之后在本地进行处理。如果远程服务器中也存在这些函数,并且可以产生相同的结果,在远程服务器中执行可以提高查询的性能。这个行为可以通过以下选项进行控制:

    • extensions,指定一个 PostgreSQL 扩展模块名称的列表,这些模块在本地和远程服务器中都需要安装并且版本兼容。这些模块中的 IMMUTABLE 函数和操作符可能发送到远程服务器执行。该选项只能在外部服务器级别进行设置,不支持表级设置。
    • fetch_size,指定每个批次返回的行数。该选项支持外部表和外部服务器级别的设置,表级设置优先级更高。默认值为 100。

    更新操作选项

    默认情况下,所有的外部表都支持 UPDATE 语句。postgres_fdw 通过以下选项控制该行为:

    • updatable,指定 postgres_fdw 是否允许外部表的 INSERT、UPDATE 以及 DELETE 操作。该选项支持外部表和外部服务器级别的设置,表级设置优先级更高。默认值为 true。

    显然,如果远程表本身不允许更新,UPDATE 语句肯定会返回错误。该选项主要用于本地检查,如果不允许更新就会返回错误,而不需要查询远程服务器。本地数据库中的 information_schema 视图将会根据该选项显示外部表是否可更新,而不会检查远程服务器。

    导入选项

    postgres_fdw 支持使用 IMPORT FOREIGN SCHEMA 语句为指定远程模式中的所有表或视图创建外部表。如果远程表中的字段使用了自定义数据类型,本地服务器中也必须创建同名的兼容类型。

    这种通过 IMPORT FOREIGN SCHEMA 导入外部模式的行为可以通过以下选项进行控制:

    • import_collate,控制导入外部表时是否包含字段的 COLLATE 属性,默认值为 true。如果远程服务器和本地服务器之间的排序规则名称不同时,可以将该选项关闭。
    • import_default,控制导入外部表时是否包含字段的 DEFAULT 表达式,默认值为 false。 如果启用了该选项,需要注意本地服务器上的默认值计算结果可能与远程服务器不同;例如 nextval() 函数的结果。如果默认值表达式使用了本地服务器中不存在的函数或者操作符,所有导入操作都将失败。
    • import_not_null,控制导入外部表时是否包含字段的 NOT NULL 约束,默认值为 true。

    除了 NOT NULL 之外的其他约束不会从远程表中导入到外部表定义。虽然 PostgreSQL 支持外部表的 CHECK 约束,但是不会自动导入该约束,因为本地和远程服务器中的约束表达式的结果可能不一致。任何 CHECK 约束行为的不一致性都可能导致难以发现的查询优化问题如果想要导入 CHECK 约束,必须手动执行操作,并且仔细验证语义的一致性。

    分区结构中的分区不会被导入;分区表会导入,除非它又是其他表的分区。因为通过分区表(分区层级中的根节点)可以访问所有的数据,这种方式可以访问表中的所有数据,不需要创建额外的对象。

    连接管理

    postgres_fdw 在第一次使用外部表时建立一个远程服务器连接,然后在同一个会话中保持并重用该连接。如果使用了多个用户映射访问远程服务器,每个用户映射都会创建一个连接。

    事务管理

    如果查询过程中引用了任何远程表,并且没有打开与本地事务对应的远程事务时,postgres_fdw 会在远程服务器中打开一个事务。远程事务随着本地事务一起提交或者中断。保存点的管理与此类似,也会在远程服务器中创建相应的保存点。

    如果本地事务使用了 SERIALIZABLE 隔离级别,远程事务也使用 SERIALIZABLE 隔离级别;否则远程事务使用 REPEATABLE READ 隔离级别。这个设置可以确保一个查询扫描多个远程表时,可以获得快照一致性的结果。在同一个事务中,多次查询远程表将会返回相同的结果,即使其他事务修改了远程表中的数据。这个行为对于本地事务使用 SERIALIZABLE 或者 REPEATABLE READ 隔离级别时是预期行为,但是对于 READ COMMITTED 隔离级别可能有些奇怪;将来的 PostgreSQL 版本中可能会修改这些规则。

    目前,postgres_fdw 还不支持远程事务的两阶段提交。

    远程查询优化

    postgres_fdw 可以尝试通过优化远程查询减少网络传输的数据量。这个功能通过将 WHERE 子句发送到远程服务器执行,以及不返回查询不需要的字段来实现。为了降低错误执行查询的风险,只有当 WHERE 子句中只涉及内置或者外部服务器 extensions 选项指定的模块中的数据类型、操作符和函数时才会发送到远程服务器。同时,操作符和函数必须指定 IMMUTABLE 属性。

    对于 UPDATE 或者 DELETE 操作,如果不存在无法发送的 WHERE 子句、本地连接查询、本地行级 BEFORE 或者 AFTER 触发器、目标表上的存储计算列、父级视图上的 CHECK OPTION 约束,postgres_fdw 可以尝试将整个语句发送到远程服务器执行。对于 UPDATE,赋值表达式中只能使用内置数据类型、IMMUTABLE 操作符或者函数,从而减少错误执行的风险。

    如果 postgres_fdw 遇到了同一个远程服务器上的外部表连接查询,会将整个连接操作发送到远程服务器,除非它认为单独返回每个表的效率更高,或者表的引用涉及了不同的用户映射。发送 JOIN 子句时,采用和上述 WHERE 子句相同的策略。

    实际发送到远程服务器的查询可以通过 EXPLAIN VERBOSE 语句进行查看。

    远程查询执行环境

    对于 postgres_fdw 打开的远程会话,search_path 参数被设置为 pg_catalog,因此默认只能看见内置的对象,除非使用模式名限定。这种行为对于postgres_fdw 提交的查询而言没有问题,因为它总是会指定模式名。不过,它可能对远程表上的触发器函数或者规则函数的执行带来问题。例如,当远程表是一个视图时,该视图中的任何函数都会在该搜索路径中查找,结果可能是不存在。推荐对于这些函数使用时加上模式名限定,或者在创建函数时使用 SET search_path 选项设置搜索路径。

    另外,postgres_fdw 还会在建立远程会话时对以下参数进行设置:

    • TimeZone 设置为 UTC;
    • DateStyle 设置为 ISO;
    • IntervalStyle 设置为 postgres;
    • extra_float_digits 设置为 (远程服务器为 PostgreSQL 9.0 以上版本) 或者 2(更早版本)。

    这些参数通常不会像 search_path 一样导致问题,但同样可以使用函数的 SET 选项进行设置。

    不推荐通过会话级别的设置覆盖这些参数的默认值,这样可能导致 postgres_fdw 运行错误。

    如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁

    展开全文
  • MySQL导入外部数据库文件

    千次阅读 2020-04-28 21:31:25
    1.打开MySQL窗口,输入密码2.创建要导入的数据库。如果本来有这个数据库就不用再创建,show databases;查看验证 3.use 数据库名; 4.最后一步导入文件 source 文件路径; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 549,914
精华内容 219,965
关键字:

外部数据库里做