menu
Pricing save_alt Download

Blog

Keep up with the latest Beekeeper Studio news.
Using the ON DELETE CASCADE Behavior in Postgres to Maintain Database Integrity Tutorial

Using the ON DELETE CASCADE Behavior in Postgres to Maintain Database Integrity

In Postgres, the delete cascade behavior can be used to automatically delete child records when their parent is deleted, maintaining the integrity of the database.
Matthew Rathbone / February 4, 2023
Quick guide to using the python-oracledb library Tutorial

Quick guide to using the python-oracledb library

How to connect to Oracle in Python. It's pretty simple, but the Oracle library has a few requirements that are unique compared to other databases.
Matthew Rathbone / January 31, 2023
Snowflake Revenue and Customer Metrics for 2023 Metrics

Snowflake Revenue and Customer Metrics for 2023

Interesting Snowflake statistics, from revenue to the number of customers and much more.
Matthew Rathbone / January 29, 2023
How to use MariaDB with Docker and docker-compose for development Tutorial

How to use MariaDB with Docker and docker-compose for development

Matthew Rathbone / January 29, 2023
How to use foreign keys in PostgreSQL Tutorial

How to use foreign keys in PostgreSQL

Use a foreign key to link one table to another, like linking orders to a customer. I'll walk through some real examples of foreign keys in action.
Matthew Rathbone / January 27, 2023
Storing and Querying JSON in SQLite: Examples and Best Practices Tutorial

Storing and Querying JSON in SQLite: Examples and Best Practices

SQLite provides two ways to store and query JSON data: using the JSON1 extension and using the BLOB type. Both approaches have their own advantages and disadvantages. Examples and best practices are discussed.
Matthew Rathbone / January 25, 2023
How to store and query JSON in SQLite using a TEXT column with examples Tutorial

How to store and query JSON in SQLite using a TEXT column with examples

The TEXT column is a great way to store JSON as it it still legible when editing the database, and a little searchable.
Matthew Rathbone / January 25, 2023
How To Store And Query JSON in SQLite Using A BLOB Column Tutorial

How To Store And Query JSON in SQLite Using A BLOB Column

BLOB columns are for binary data, but with a bit of work we can use them to store JSON data too. There are limitations to this approach however. Examples in Python
Matthew Rathbone / January 25, 2023
Storing Images in a Database: Methods and Considerations Tutorial

Storing Images in a Database: Methods and Considerations

There are several ways to store images in a database, including as binary data, file paths, or using cloud storage. The best method depends on the specific requirements and constraints of the project.
Matthew Rathbone / January 23, 2023
Solving Postgres "Peer Authentication Failed for User" Errors Tutorial

Solving Postgres "Peer Authentication Failed for User" Errors

Peer authentication failed for user errors in Postgres occur when the user is not authorized to access the database. This is commonly due to incorrect configuration in the pg_hba.conf file or a mismatch in the operating system and database user name
Matthew Rathbone / January 21, 2023
Solving MySQL 2003: can't connect to mysql server on localhost Tutorial

Solving MySQL 2003: can't connect to mysql server on localhost

If you're unable to connect to the MySQL server on localhost, there are a few potential causes and solutions to consider. This article provides a step-by-step guide to troubleshooting and resolving this issue
Matthew Rathbone / January 21, 2023
How to Solve the 'SQLite Database is Locked' Error Tutorial

How to Solve the 'SQLite Database is Locked' Error

If you are encountering the 'SQLite database is locked' error, it means that the database you are trying to access is already in use by some other process. Here are some steps you can take to try and resolve the error.
Matthew Rathbone / January 21, 2023
Creating Pivot Tables in Oracle Database Using PIVOT and UNPIVOT Operators Tutorial

Creating Pivot Tables in Oracle Database Using PIVOT and UNPIVOT Operators

To create a pivot table in Oracle Database, you can use the PIVOT and UNPIVOT operators in combination with other SQL statements. This allows you to quickly and easily organize and summarize large sets of data, providing valuable insights into your data.
Matthew Rathbone / January 19, 2023
Creating Pivot Tables in PostgreSQL using the crosstab() function Tutorial

Creating Pivot Tables in PostgreSQL using the crosstab() function

To create a pivot table in PostgreSQL, you can use the crosstab() function from the tablefunc extension. This function allows you to pivot data from a source table to create a new table with the data organized in a more useful way. This can be a powerful tool for summarizing and analyzing large amounts of data.
Matthew Rathbone / January 17, 2023
How to List Databases Using the psql command line tool Tutorial

How to List Databases Using the psql command line tool

To list all databases in Postgres, use the \l command in the psql command-line interface. This will display a table with the database name, owner, encoding, and collation for each database on the server. Alternatively, use the \du or \db commands to list databases that you have access to or to see detailed information about a specific database.
Matthew Rathbone / January 15, 2023
Adding a Primary Key to an Existing Table in PostgreSQL Tutorial

Adding a Primary Key to an Existing Table in PostgreSQL

Learn how to add a primary key to an existing table in PostgreSQL using the ALTER TABLE command
Matthew Rathbone / January 14, 2023
Composite Primary Keys in SQL Tutorial

Composite Primary Keys in SQL

A composite primary key is a type of database key that consists of two or more columns in a table. In this guide, we will provide examples of how to create, modify, and use composite primary keys in SQL
Matthew Rathbone / January 14, 2023
Dropping Constraints in PostgreSQL: A Guide Tutorial

Dropping Constraints in PostgreSQL: A Guide

To drop a constraint in PostgreSQL, use the `ALTER TABLE` command followed by the `DROP CONSTRAINT` clause, specifying the name of the constraint to be dropped. Be careful, as this can potentially lead to data integrity issues.
Matthew Rathbone / January 13, 2023
Ultimate Guide To Database Transactions Tutorial

Ultimate Guide To Database Transactions

An outline of what a database transaction is, why they are important, code examples of how to use them, and a walkthrough of the different transaction states.
Lisandro Fernigrini / January 13, 2023
Deleting a Database in MySQL: A Step-by-Step Guide Tutorial

Deleting a Database in MySQL: A Step-by-Step Guide

To delete a database in MySQL, use the DROP DATABASE command, be careful, this action is permanent.
Matthew Rathbone / January 11, 2023
Creating Indexes in Postgresql: How to Use the CREATE INDEX Statement Tutorial

Creating Indexes in Postgresql: How to Use the CREATE INDEX Statement

To create an index in Postgresql, you can use the CREATE INDEX statement. This allows you to specify the index name, table and column, and index type. Indexes can improve query performance, but can also impact write performance, so use them wisely.
Matthew Rathbone / January 9, 2023
What Is A Deadlock In SQL Tutorial

What Is A Deadlock In SQL

A deadlock in SQL occurs when two transactions are waiting for each other to release locks on database resources, causing a standstill in execution. To avoid deadlocks, keep reading.
Matthew Rathbone / January 7, 2023
Rails Migrations: Using bigint Tutorial

Rails Migrations: Using bigint

Ints to small for you? Here's how to use bitint in rails migrations.
Matthew Rathbone / January 7, 2023
PostgreSQL ON CONFLICT Walkthrough Tutorial

PostgreSQL ON CONFLICT Walkthrough

Learn how to use the ON CONFLICT clause in PostgreSQL to handle unique constraint violations and update existing records.
Matthew Rathbone / January 7, 2023
Creating a User in MariaDB: A Step-by-Step Guide Tutorial

Creating a User in MariaDB: A Step-by-Step Guide

To create a new user in MariaDB, use the `CREATE USER` and `GRANT` statements to create the user and grant necessary privileges, then use `FLUSH PRIVILEGES` to make the changes take effect. Manage user accounts carefully for security and integrity.
Matthew Rathbone / January 7, 2023
Beekeeper Studio 3.8 - Cassandra support & read-only connections Release

Beekeeper Studio 3.8 - Cassandra support & read-only connections

New beta support for Cassandra along with optimizations and read-only connections.
Matthew Rathbone / January 6, 2023
Rails Migration: Add Default Value Tutorial

Rails Migration: Add Default Value

Forgot to set a default value for a column? No problem, just add a new rails migration using the syntax in this post.
Matthew Rathbone / January 6, 2023
rails migration belongs_to Tutorial

rails migration belongs_to

Matthew Rathbone / January 4, 2023
Rails Migrations: Basic data Types Tutorial

Rails Migrations: Basic data Types

what types does rails provide for migrations? Well all of them really, but it has helpers for the most common.
Matthew Rathbone / January 3, 2023
Rails Migration: Add Foreign Key Tutorial

Rails Migration: Add Foreign Key

Foreign keys add relationships between tables in your database, here's how to add them using a Rails migration.
Matthew Rathbone / January 2, 2023
How to use 'rails generate migration' to create a table Tutorial

How to use 'rails generate migration' to create a table

The rails command line tool is super useful for generating table creation migrations without having to write any custom code at all.
Matthew Rathbone / January 1, 2023
Creating Unique Constraints in PostgreSQL: A Guide Tutorial

Creating Unique Constraints in PostgreSQL: A Guide

A unique constraint in PostgreSQL ensures that no two rows in a table have the same values in a specified column or set of columns. Here's how to create one
Matthew Rathbone / January 1, 2023
Comparing SQLite and MySQL Tutorial

Comparing SQLite and MySQL

SQLite and MySQL are two popular databases that are often used in web applications. Although both are relational databases, they have some significant differences in terms of performance, features, and capabilities. In this article, we'll compare the two databases and discuss their key differences.
Matthew Rathbone / December 31, 2022
Rails Migration: add index syntax Tutorial

Rails Migration: add index syntax

Speed up your database queries with indexes. Here's how to create them in a rails migration.
Matthew Rathbone / December 31, 2022
PostgreSQL Comparing Two Values Tutorial

PostgreSQL Comparing Two Values

How to compare two values in PostgreSQL
Matthew Rathbone / December 31, 2022
How long does it take to learn SQL? Tutorial

How long does it take to learn SQL?

It typically takes a few weeks to a couple of months to learn SQL, depending on the individual's prior experience and dedication to learning the language.
Matthew Rathbone / December 31, 2022
Rails Migration: Rename Column Tutorial

Rails Migration: Rename Column

Matthew Rathbone / December 30, 2022
Rails Migration: Remove Column Tutorial

Rails Migration: Remove Column

Oh man you left that column in by mistake? Here's how to remove it.
Matthew Rathbone / December 28, 2022
Boolean Columns in SQLite: A Beginner's Guide Tutorial

Boolean Columns in SQLite: A Beginner's Guide

Boolean columns in SQLite are useful for storing data with a binary nature, but in SQLite they're a little different...
Matthew Rathbone / December 28, 2022
Beginners Guide To Columnar Databases Tutorial

Beginners Guide To Columnar Databases

A columnar database is a type of database management system (DBMS) that stores data in columns rather than rows.
Matthew Rathbone / December 28, 2022
How to use "rails g migration add column" Tutorial

How to use "rails g migration add column"

Rails can do code gen for a migration for adding a column right from the command line. Here's the syntax.
Matthew Rathbone / December 27, 2022
Top 5 Open Source Databases Tutorial

Top 5 Open Source Databases

If you need a database, you can't go wrong with one of these top-knotch open source databases used by millions of developers all over the world.
Matthew Rathbone / December 25, 2022
Rails Migrations - Drop Table Tutorial

Rails Migrations - Drop Table

How to drop a table in a rails migration.
Matthew Rathbone / December 24, 2022
Listing Databases in PostgreSQL: The Equivalent of MySQL's SHOW DATABASES Command Tutorial

Listing Databases in PostgreSQL: The Equivalent of MySQL's SHOW DATABASES Command

To list all databases on a PostgreSQL server, use the commands shown below, they accomplish the same as the SHOW DATABASES command from MySQL
Matthew Rathbone / December 24, 2022
Rails How To Rollback A Migration Tutorial

Rails How To Rollback A Migration

If something goes wrong, you'll want to roll back your migrations to a safe spot. Here's how.
Matthew Rathbone / December 23, 2022
How To Generate A Rails Migration Tutorial

How To Generate A Rails Migration

using the rails command line tools to generate a migration
Matthew Rathbone / December 22, 2022
Having vs Where in SQL Tutorial

Having vs Where in SQL

Both WHERE and HAVING are used to filter query results, but HAVING can only be used on aggregate function results.
Matthew Rathbone / December 21, 2022
Databricks Competitors Tutorial

Databricks Competitors

Databricks faces competition from other companies in the big data analytics and cloud computing space.
Matthew Rathbone / December 20, 2022
Understanding the Differences between Databases and Data Warehouses Tutorial

Understanding the Differences between Databases and Data Warehouses

While both databases and data warehouses are used to store data, there are key differences in the way they are designed and used. Databases are designed for transactional needs, while data warehouses are designed for analysis and reporting.
Matthew Rathbone / December 18, 2022
Comparing Amazon RDS and Redshift: Key Differences and Use Cases Tutorial

Comparing Amazon RDS and Redshift: Key Differences and Use Cases

Amazon RDS and Redshift are both cloud-based data storage services offered by AWS, but are intended for different use cases. RDS is a fully-managed relational database service, while Redshift is a partially-managed data warehousing service optimized for fast querying of large datasets. Key differences include pricing and management requirements.
Matthew Rathbone / December 18, 2022
Amazon Athena vs Redshift: Comparing Cloud-Based Data Storage and Analysis Services Tutorial

Amazon Athena vs Redshift: Comparing Cloud-Based Data Storage and Analysis Services

Amazon Athena and Amazon Redshift are two cloud-based data storage and analysis services offered by AWS. While they share some similarities, they are designed for different use cases and have a number of key differences. Athena is a querying service for structured and unstructured data, while Redshift is a data warehousing service for large volumes of structured data.
Matthew Rathbone / December 16, 2022
PostgreSQL CREATE TABLE Walkthrough With Examples Tutorial

PostgreSQL CREATE TABLE Walkthrough With Examples

How to create tables in Postgres taking into account schemas, permissions, primary keys, existing data, and more.
Shanika Wickramasinghe / December 14, 2022
10+ Best Oracle Database Tools Tutorial

10+ Best Oracle Database Tools

Level up your Oracle Database work with these amazing tools.
Lisandro Fernigrini / December 14, 2022
Understanding Database Relationships: A Beginner's Guide Tutorial

Understanding Database Relationships: A Beginner's Guide

A database relationship is a connection between two or more pieces of data in a database. By understanding the different types of relationships that can exist between data, you can effectively manage and work with a database. This is important for ensuring that your data is organized, consistent, and accurate.
Matthew Rathbone / December 14, 2022
How to make a pivot table in SQL Tutorial

How to make a pivot table in SQL

A pivot table is a two dimensional table to summarize data, here's how to make a simple pivot table using only SQL.
Matthew Rathbone / December 12, 2022
MariaDB vs MySQL Tutorial

MariaDB vs MySQL

MariaDB and MySQL are both excellent databases. Which one you use will depend on what you need most - new features or corporate support.
Matthew Rathbone / December 12, 2022
SQL JSON_EXTRACT Walkthrough With Examples Tutorial

SQL JSON_EXTRACT Walkthrough With Examples

How to use JSON_EXTRACT to interact with json data stored as a string in a SQL Database
Matthew Rathbone / December 5, 2022
PostgreSQL How To Use Schemas Tutorial

PostgreSQL How To Use Schemas

What are schemas in PostgreSQL and how to use them to make your life easier and organize your DB objects.
Matthew Rathbone / December 3, 2022
PostgreSQL CONSTRAINT Walkthrough Tutorial

PostgreSQL CONSTRAINT Walkthrough

Learn what a constraint is and how to use it on your PostgreSQL tables.
Matthew Rathbone / December 3, 2022
SQL CTE vs Subquery Walkthrough With Examples Tutorials

SQL CTE vs Subquery Walkthrough With Examples

You won't believe how nice these SQL statements look when turned into CTEs 😍.
Lucas Gray / November 18, 2022
Running Postgres in Docker for Local Development Tutorial

Running Postgres in Docker for Local Development

Docker is a great way to install Postgres in your development environment. Use the docker-compose templates we provide below
Matthew Rathbone / November 10, 2022
Oracle CREATE USER Tutorial With Examples Tutorial

Oracle CREATE USER Tutorial With Examples

How to use CREATE USER in Oracle to authenticate and permission a user. Syntax examples and advanced topics
Lisandro Fernigrini / November 4, 2022
How to Find Your Oracle Database Version Number Tutorial

How to Find Your Oracle Database Version Number

Need to know what version (or edition) of Oracle Database you are using? We'll walk through all the ways you can find it, even if your Oracle Database doesn't start.
Lisandro Fernigrini / October 30, 2022
Beekeeper Studio 3.7 - UI enhancements and compatibility improvements Release

Beekeeper Studio 3.7 - UI enhancements and compatibility improvements

BKS now has new superpowers such as drop/truncate support, Redshift IAM auth, markdown data exports, and gained some formatting memory
Matthew Rathbone / September 29, 2022
7 Must-Have Tools For Developers That Use PostgreSQL Tutorial

7 Must-Have Tools For Developers That Use PostgreSQL

These tools will help you level up your PostgreSQL installation.
Etai Stein / September 26, 2022
Oracle Database Backups - A Beginners Guide Tutorial

Oracle Database Backups - A Beginners Guide

I'll discuss some backup strategies including offline backups, online backups, exports, and cloud specific options. I'll talk a lot about RMAN. Finally I'll weigh in on which backup strategy you should use.
Lisandro Fernigrini / September 26, 2022
Oracle CREATE DATABASE LINK Guide Tutorial

Oracle CREATE DATABASE LINK Guide

In this tutorial I'll teach you how to connect your Oracle Database to another datastore and query them together like they're a single database.
Lisandro Fernigrini / September 2, 2022
How To List Oracle Tables Tutorial

How To List Oracle Tables

Sometimes you need to explore your Oracle database to find an existing table. In this guide we'll show you how to list and filter your Oracle tables.
Matthew Rathbone / August 19, 2022
PostgreSQL - Change The Type Of A Column, A Walkthrough With Examples Tutorial

PostgreSQL - Change The Type Of A Column, A Walkthrough With Examples

How to change a PostgreSQL column type without messing up your table, losing data, or taking down your database.
Matthew Rathbone / June 16, 2022
How to create a database in SQLite Tutorials

How to create a database in SQLite

SQLite is a friendly database technology that uses .db files to store data, but it doesn't support the standard `CREATE DATABASE` SQL statement. Thankfully creating a new database is easier than you think.
Matthew Rathbone / May 30, 2022
Beekeeper Studio 3.3 - M1, Themes, and Shortcuts Release

Beekeeper Studio 3.3 - M1, Themes, and Shortcuts

System theming, M1 Mac support, keyboard shortcuts, SQLite STRICT syntax support, and more in today's release
Matthew Rathbone / March 28, 2022
SQLite DB Browser Guides

SQLite DB Browser

Browse your SQLite tables, edit data, alter columns and more using the most intuitive SQLite DB Browser on the market.
Matthew Rathbone / March 10, 2022
Beekeeper Studio Ultimate Edition Release

Beekeeper Studio Ultimate Edition

Tl;dr: Beekeeper Studio Ultimate Edition is now available, code is now GPL, and team workspaces are deprecated
Matthew Rathbone / February 21, 2022
Guide to Distributing Electron Apps For Linux Tutorial

Guide to Distributing Electron Apps For Linux

There are half a dozen different packages you can build for Linux, but should you? By the end of this article you'll know what to do and why.
Matthew Rathbone / January 15, 2022
Postgres Client For Ubuntu news

Postgres Client For Ubuntu

Beekeeper Studio is an open source, modern, and easy-to-use Postgres client for Ubuntu
Matthew Rathbone / January 14, 2022
Introducing Team Workspaces - Online Storage for Beekeeper Studio Release

Introducing Team Workspaces - Online Storage for Beekeeper Studio

Share connections and queries across machines, and maybe even collaborate with team members, if you have any.
Matthew Rathbone / December 13, 2021
Release 2.1 - Quick Search Release

Release 2.1 - Quick Search

Quickly jump between tables and saved queries with Quick Search. Simply hit CTRL-P (or CMD-P) and start typing.
Matthew Rathbone / September 14, 2021
Beekeeper Studio 2.0 - Celebrating 10x YoY Growth With New Features And A Small Retrospective Release

Beekeeper Studio 2.0 - Celebrating 10x YoY Growth With New Features And A Small Retrospective

Schema editing, index editing, and relation editing are our big ticket new features. But wait, there's more! We also talk through growth metrics over the last year [with charts] and go all starry eyed about what the future holds.
Matthew Rathbone / August 30, 2021
Release 1.13 - Build and Edit Database Tables Release

Release 1.13 - Build and Edit Database Tables

Use a visual interface to create and modify table schemas, no need to remember esotoric SQL. Available for all databases - Postgres, MySQL, SQL Server, Redshift, Cockroach, and SQLite.
Matthew Rathbone / July 26, 2021
Introducing SQLTools - relational database tools in your browser SQLTools

Introducing SQLTools - relational database tools in your browser

SQLTools provides SQL formatting, table building, and table templates to everyone on the internet. It's FOSS and powered by Beekeeper Studio and Vue.js.
Matthew Rathbone / June 29, 2021
Release 1.12 - Table Properties and File Associations Release

Release 1.12 - Table Properties and File Associations

Document tables and inspect table schemas, triggers, indexes, and relations.
Matthew Rathbone / June 7, 2021
Release 1.11 - Data exports and better table editing tools Release

Release 1.11 - Data exports and better table editing tools

Export database table data, clone rows, and add new rows for all databases.
Matthew Rathbone / May 17, 2021
1.10 Engine Improvements Release

1.10 Engine Improvements

Knocking out some deep gnarley issues to make using Beekeeper for SQL and Table editing much smoother
Matthew Rathbone / March 15, 2021
1.9 Functions, Procedures, and SSL love Release

1.9 Functions, Procedures, and SSL love

View functions and procedures, use sslMode=require, and reorder tabs at will.
Matthew Rathbone / January 4, 2021
Release 1.8 - ARM build, Custom SSL certs, performance improvements, tweaks, and bug fixes Release

Release 1.8 - ARM build, Custom SSL certs, performance improvements, tweaks, and bug fixes

Our SQL editor gets a little better thanks to many quality community contributions.
Matthew Rathbone / October 23, 2020
Beekeeper Studio Launch and Q3 2020 by the numbers Metrics

Beekeeper Studio Launch and Q3 2020 by the numbers

A regular review of our performance metrics, this time including a reflection on our launch in April 2020.
Matthew Rathbone / October 5, 2020
Quick Guide to Building Electon Apps For ARM Linux and the Raspberry Pi Tutorials

Quick Guide to Building Electon Apps For ARM Linux and the Raspberry Pi

Building apps on ARM isn't as simple as it should be. AppImage building is easy, but DEB, RPM and Snap packages are trouble. Fear not! Help is at hand.
Matthew Rathbone / September 14, 2020
Release 1.7 - SQL Table Editing and Foreign Key Lookups Release

Release 1.7 - SQL Table Editing and Foreign Key Lookups

Edit your SQL tables, one-click navigate to foreign key records, and format your SQL queries in one click. Huge feature release!
Matthew Rathbone / August 28, 2020
Building an Electron App in Windows with WSL 2 and Ubuntu Tutorials

Building an Electron App in Windows with WSL 2 and Ubuntu

Windows Subsystem for Linux (WSL) version 2 provides a native Linux runtime right inside of Windows. It's pretty rad. I'll show you how to use that environment to build cross-platform apps with Ubuntu 20.04, Electron, and Vue.
Matthew Rathbone / August 2, 2020
Redshift Client for Linux, MacOS, and Windows Guides

Redshift Client for Linux, MacOS, and Windows

Beekeeper Studio is a free and open source database client. We support many databases, but we really love Redshift.
Matthew Rathbone / July 24, 2020
Release 1.6 - Statusbars, Menus, and Yak Shaving Release

Release 1.6 - Statusbars, Menus, and Yak Shaving

We're pushing our UX forward with some major usability improvements -- but at what cost?
Matthew Rathbone / July 20, 2020
Release 1.5 - Community Enhancement Megapack Release

Release 1.5 - Community Enhancement Megapack

A whole bunch of new features, usability improvements, and bugfixes. This whole release is community developed!
Matthew Rathbone / June 14, 2020
Release 1.4 - SSH Tunnels, SQL Server, and Multiple Queries Release

Release 1.4 - SSH Tunnels, SQL Server, and Multiple Queries

Windows Integrated Login, Jump Hosts, and being able to click things are some of this week's key features.
Matthew Rathbone / May 22, 2020
Release 1.3 - Bugfix Bonanza Release

Release 1.3 - Bugfix Bonanza

Lots of UI tweaks and database enhancements, especially if you use Postgres
Matthew Rathbone / May 12, 2020
Release V1.2 Release

Release V1.2

Filter, Sort, and Filter SQL table data with the new version of Beekeeper Studio.
Matthew Rathbone / May 5, 2020