Python 앱 개발에서 YugabyteDB 사용
이 기사에서는 로컬 클러스터용 YugabyteDB를 설정하고 데이터를 채우고 Python3을 사용하여 데이터에 액세스합니다.
YugabyteDB 설치 및 구성
설치는 매우 쉽고 간단합니다. 소스 코드 컴파일이 없습니다(정말로 깊이 파고 싶지 않다면). 그냥 download YugabyteDB를 추출하고 실행하십시오
bin/post-install.sh
. 이 단계가 완료되면 path/to/extracted/yugabytedb/bin
가 $PATH에 있는지 확인하십시오. 내가 한 일은 다음과 같습니다.생선 껍질
$ set -x path/to/extracted/yugabytedb/bin $PATH
배쉬 쉘
$ export PATH=path/to/extracted/yugabytedb/bin:$PATH
Note: to avoid writing the same thing over and over again, I usually put the
set
orexport
statements above inside a file and then whenever I want to use YugabyteDB, I justsource the-file.sh
.
다음으로 YugabyteDB를 구성해야 합니다. YugabyteDB를 구성하려면 YugabyteDB configuration 을 참조하십시오. 문서는 완전하지만 모든 것이 작동하도록 하려면 다음과 같이 변경
/etc/security/limits.conf
만 하면 됩니다.# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
...
...
...
#<domain> <type> <item> <value>
#
* - core unlimited
* - data unlimited
* - fsize unlimited
* - sigpending 119934
* - memlock 64
* - rss unlimited
* - nofile 1048576
* - msgqueue 819200
* - stack 8192
* - cpu unlimited
* - nproc 12000
* - locks unlimited
# End of file
상황에 따라 다시 시작하거나 다시 로그아웃-로그인해야 할 수도 있습니다.
YugabyteDB의 모든 데이터, 로그, 구성 등은
$HOME/var/
에 있습니다. 추가 구성을 확인하려면$HOME/var/conf/yugabytedb.conf
:{
"tserver_webserver_port": 9000,
"master_rpc_port": 7100,
"universe_uuid": "dabc3d28-6982-4585-8b10-5faa7352da02",
"webserver_port": 7200,
"ysql_enable_auth": false,
"cluster_member": true,
"ycql_port": 9042,
"data_dir": "/home/bpdp/var/data",
"tserver_uuid": "71ad70b8eef149ae945842572e0fff75",
"use_cassandra_authentication": false,
"log_dir": "/home/bpdp/var/logs",
"polling_interval": "5",
"listen": "0.0.0.0",
"callhome": true,
"master_webserver_port": 7000,
"master_uuid": "1ef618e573a04e1d835f4ed4364825d7",
"master_flags": "",
"node_uuid": "6ae31951-7199-4c22-b30b-e8f235cef7db",
"join": "",
"ysql_port": 5433,
"tserver_flags": "",
"tserver_rpc_port": 9100
}
Note: PostgreSQL usually uses port 5432, but YugabyteDB default port is 5433. Pay attention to this since we are going to use this when we write our code.
YugabyteDB로 할 수 있는 일은 많지만 이 기사에서는 Python 앱 개발에 더 집중할 것입니다. 따라서 이제 로컬 클러스터만 있으면 충분합니다. 설정하자!.
YugabyteDB를 실행해 보겠습니다.
$ yugabyted start
Starting yugabyted...
✅ System checks
+--------------------------------------------------------------------------------------------------+
| yugabyted |
+--------------------------------------------------------------------------------------------------+
| Status : Running. Leader Master is present |
| Web console : http://127.0.0.1:7000 |
| JDBC : jdbc:postgresql://127.0.0.1:5433/yugabyte?user=yugabyte&password=yugabyte |
| YSQL : bin/ysqlsh -U yugabyte -d yugabyte |
| YCQL : bin/ycqlsh -u cassandra |
| Data Dir : /home/bpdp/var/data |
| Log Dir : /home/bpdp/var/logs |
| Universe UUID : dabc3d28-6982-4585-8b10-5faa7352da02 |
+--------------------------------------------------------------------------------------------------+
🚀 yugabyted started successfully! To load a sample dataset, try 'yugabyted demo'.
🎉 Join us on Slack at https://www.yugabyte.com/slack
👕 Claim your free t-shirt at https://www.yugabyte.com/community-rewards/
$
상태 확인:
$ yugabyted status
+--------------------------------------------------------------------------------------------------+
| yugabyted |
+--------------------------------------------------------------------------------------------------+
| Status : Running. Leader Master is present |
| Web console : http://127.0.0.1:7000 |
| JDBC : jdbc:postgresql://127.0.0.1:5433/yugabyte?user=yugabyte&password=yugabyte |
| YSQL : bin/ysqlsh -U yugabyte -d yugabyte |
| YCQL : bin/ycqlsh -u cassandra |
| Data Dir : /home/bpdp/var/data |
| Log Dir : /home/bpdp/var/logs |
| Universe UUID : dabc3d28-6982-4585-8b10-5faa7352da02 |
+--------------------------------------------------------------------------------------------------+
YugabyteDB를 종료해야 하는 경우를 대비하여:
$ yugabyted stop
Stopped yugabyted using config /home/bpdp/var/conf/yugabyted.conf.
$
자, 이제 YugabyteDB를 실행해 보겠습니다. 이후 프로세스에 사용할 것입니다.
데이터 준비
이제 더 흥미로워집니다. 하나의 YugabyteDB 서버 인스턴스를 사용하여 SQL 및 Cassandra 데이터 모델을 모두 사용할 수 있습니다. 일부 데이터를 PostgreSQL 계층과 Cassandra 계층으로 집계해 보겠습니다. 이를 위해 우리는 여전히 기본 사용자와 비밀번호를 사용합니다. 나중에 YugabyteDB의 보안 측면을 관리할 수 있습니다.
Note: default username and password for PostgreSQL layer: yugabyte:yugabyte, while for Cassandra: cassandra:cassandra.
SQL 데이터
YugabyteDB는 SQL 데이터에 대해 sample datasets을 제공합니다. 우리는 Northwind Traders Database 을 사용할 것입니다. Northwind 샘플 데이터 세트 URL에서
DDL
및 Data
스크립트를 가져옵니다. 이 장면 덤프를 따라 데이터베이스, 테이블을 준비하고 데이터를 채웁니다. # pompt는 명령을 작성하는 위치입니다.$ ysqlsh -U yugabyte
ysqlsh (11.2-YB-2.7.2.0-b0)
Type "help" for help.
yugabyte=# create database northwind;
CREATE DATABASE
yugabyte=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------------+----------+----------+---------+-------------+-----------------------
northwind | yugabyte | UTF8 | C | en_US.UTF-8 |
postgres | postgres | UTF8 | C | en_US.UTF-8 |
system_platform | postgres | UTF8 | C | en_US.UTF-8 |
template0 | postgres | UTF8 | C | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
yugabyte | postgres | UTF8 | C | en_US.UTF-8 |
(6 rows)
yugabyte=# \c northwind
You are now connected to database "northwind" as user "yugabyte".
northwind=# \i northwind_ddl.sql
SET
SET
SET
SET
SET
SET
SET
SET
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
northwind=# \d
List of relations
Schema | Name | Type | Owner
--------+------------------------+-------+----------
public | categories | table | yugabyte
public | customer_customer_demo | table | yugabyte
public | customer_demographics | table | yugabyte
public | customers | table | yugabyte
public | employee_territories | table | yugabyte
public | employees | table | yugabyte
public | order_details | table | yugabyte
public | orders | table | yugabyte
public | products | table | yugabyte
public | region | table | yugabyte
public | shippers | table | yugabyte
public | suppliers | table | yugabyte
public | territories | table | yugabyte
public | us_states | table | yugabyte
(14 rows)
northwind=# \i northwind_data.sql
...
...
...
INSERT 0 1
INSERT 0 1
INSERT 0 1
northwind=# select * from products;
product_id | product_name | supplier_id | category_id | quantity_per_unit | unit_price | units_in_s
tock | units_on_order | reorder_level | discontinued
-----------------+----------------------------------+-------------+-------------+----------------------+------------+-----------
----------+----------------+---------------+--------------
4 | Chef Anton's Cajun Seasoning | 2 | 2 | 48 - 6 oz jars | 22 |
53 | 0 | 0 | 0
46 | Spegesild | 21 | 8 | 4 - 450 g glasses | 12 |
95 | 0 | 0 | 0
73 | Röd Kaviar | 17 | 8 | 24 - 150 g jars | 15 |
101 | 0 | 5 | 0
29 | Thüringer Rostbratwurst | 12 | 6 | 50 bags x 30 sausgs. | 123.79 |
0 | 0 | 0 | 1
70 | Outback Lager | 7 | 1 | 24 - 355 ml bottles | 15 |
15 | 10 | 30 | 0
25 | NuNuCa Nuß-Nougat-Creme | 11 | 3 | 20 - 450 g glasses | 14 |
76 | 0 | 30 | 0
54 | Tourtière | 25 | 6 | 16 pies | 7.45 |
21 | 0 | 10 | 0
...
...
...
17 | Alice Mutton | 7 | 6 | 20 - 1 kg tins | 39 |
0 | 0 | 0 | 1
59 | Raclette Courdavault | 28 | 4 | 5 kg pkg. | 55 |
79 | 0 | 0 | 0
(77 rows)
northwind=#
SQL 데이터로 끝내십시오. 이제 열 전체를 채울 시간입니다. Cassandra 데이터입니다.
NOSQL 열 전체 데이터 - Apache Cassandra
우리는 간단한 키스페이스를 사용할 것입니다: 하나의 키스페이스는 하나의 테이블로 구성됩니다. CQL 스크립트 파일을 만듭니다(여기서 파일 이름은
zimera-employees.cql
입니다).CREATE KEYSPACE zimera
WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 3};
USE zimera;
CREATE TABLE employees(
e_id int PRIMARY KEY,
e_fullname text,
e_address text,
e_dept text,
e_role text
);
INSERT INTO employees (e_id, e_fullname, e_address, e_dept, e_role) VALUES(1,'Zaky A. Aditya', 'Dusun Medelan, RT 01, Umbulmartani, Ngemplak, Sleman, DIY, Indonesia', 'Information Technology', 'Machine Learning Developer');
스크립트를 실행합니다.
$ ycqlsh -f zimera-employees.cql
$
성공 여부 확인:
$ ycqlsh -u cassandra
Password:
Connected to local cluster at 127.0.0.1:9042.
[ycqlsh 5.0.1 | Cassandra 3.9-SNAPSHOT | CQL spec 3.4.2 | Native protocol v4]
Use HELP for help.
cassandra@ycqlsh> use zimera;
cassandra@ycqlsh:zimera> select * from employees;
e_id | e_fullname | e_address | e_dept | e_role
-----------+----------------+----------------------------------------------------------------------+------------------------+----------------------------
1 | Zaky A. Aditya | Dusun Medelan, RT 01, Umbulmartani, Ngemplak, Sleman, DIY, Indonesia | Information Technology | Machine Learning Developer
(1 rows)
cassandra@ycqlsh:zimera>
$
파이썬 - 드라이버
PostgreSQL과 Apache Cassandra 데이터 모델을 모두 사용할 것이므로 PostgreSQL용 psycopg2 및 Python Driver for Apache Cassandra 두 드라이버를 설치해야 합니다.
Note: currently,
psycopg
is still developing psycopg3. We do not use psycopg3 since it is still in early development stage, but oncepsycopg3
is released, there should be easy to migrate.
카산드라 드라이버 설치
$ conda install cassandra-driver
...
...
...
added / updated specs:
- cassandra-driver
The following packages will be downloaded:
package | build
---------------------------|-----------------
cassandra-driver-3.25.0 | py39h27cfd23_0 3.0 MB
------------------------------------------------------------
Total: 3.0 MB
The following NEW packages will be INSTALLED:
blas pkgs/main/linux-64::blas-1.0-mkl
cassandra-driver pkgs/main/linux-64::cassandra-driver-3.25.0-py39h27cfd23_0
intel-openmp pkgs/main/linux-64::intel-openmp-2021.3.0-h06a4308_3350
libev pkgs/main/linux-64::libev-4.33-h7b6447c_0
mkl pkgs/main/linux-64::mkl-2021.3.0-h06a4308_520
mkl-service pkgs/main/linux-64::mkl-service-2.4.0-py39h7f8727e_0
mkl_fft pkgs/main/linux-64::mkl_fft-1.3.0-py39h42c9631_2
mkl_random pkgs/main/linux-64::mkl_random-1.2.2-py39h51133e4_0
numpy pkgs/main/linux-64::numpy-1.20.3-py39hf144106_0
numpy-base pkgs/main/linux-64::numpy-base-1.20.3-py39h74d4b33_0
six pkgs/main/noarch::six-1.16.0-pyhd3eb1b0_0
Proceed ([y]/n)? y
...
...
...
$
PostgreSQL 드라이버 설치
$ conda install psycopg2 ...
...
...
added / updated specs:
- psycopg2
The following NEW packages will be INSTALLED:
krb5 pkgs/main/linux-64::krb5-1.19.2-hac12032_0
libedit pkgs/main/linux-64::libedit-3.1.20210714-h7f8727e_0
libpq pkgs/main/linux-64::libpq-12.2-h553bfba_1
psycopg2 pkgs/main/linux-64::psycopg2-2.8.6-py39h3c74f83_1
Proceed ([y]/n)? y
...
...
$
Note: I use
conda
for package management, but you don't need to. You can also usepip
, in this case justpip install psycopg2
andpip install cassandra-driver
.
코딩하자!
SQL 데이터 액세스
# code-sql.py
import psycopg2
conn = psycopg2.connect(
host="localhost",
database="northwind",
user="yugabyte",
port="5433",
password="yugabyte")
# Open a cursor to perform database operations
cur = conn.cursor()
# Execute a query
cur.execute("SELECT * FROM products")
# Retrieve query results
records = cur.fetchall()
print(records[0])
결과:
$ python code-sql.py
(4, "Chef Anton's Cajun Seasoning", 2, 2, '48 - 6 oz jars', 22.0, 53, 0, 0, 0)
$
Cassandra 데이터 모델 액세스
from cassandra.cluster import Cluster
cluster = Cluster()
session = cluster.connect('zimera')
rows = session.execute('SELECT e_fullname, e_address, e_dept, e_role FROM employees')
for row in rows:
print(row.e_fullname, row.e_address, row.e_dept, row.e_role)
결과:
$ python code-cassandra.py
Zaky A. Aditya Dusun Medelan, RT 01, Umbulmartani, Ngemplak, Sleman, DIY, Indonesia Information Technology Machine Learning Developer
$
하나의 파이썬 소스 코드에서 두 데이터 모델을 모두 사용하려면 어떻게 해야 할까요? 여기 있습니다:
# code-all.py
import psycopg2
from cassandra.cluster import Cluster
conn = psycopg2.connect(
host="localhost",
database="northwind",
user="yugabyte",
port="5433",
password="yugabyte")
# Open a cursor to perform database operations
cur = conn.cursor()
# Execute a query
cur.execute("SELECT * FROM products")
# Retrieve query results
records = cur.fetchall()
print(records[0])
cluster = Cluster()
session = cluster.connect('zimera')
rows = session.execute('SELECT e_fullname, e_address, e_dept, e_role FROM employees')
for row in rows:
print(row.e_fullname, row.e_address, row.e_dept, row.e_role)
결과:
$ python code-all.py
(4, "Chef Anton's Cajun Seasoning", 2, 2, '48 - 6 oz jars', 22.0, 53, 0, 0, 0)
Zaky A. Aditya Dusun Medelan, RT 01, Umbulmartani, Ngemplak, Sleman, DIY, Indonesia Information Technology Machine Learning Developer
$
멋지지 않아? 즐거운 코딩!
Reference
이 문제에 관하여(Python 앱 개발에서 YugabyteDB 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/zimerasystems/using-yugabytedb-in-python-app-development-2en5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)