(1) Execute SQL Query(쿼리) 실행
(2) Execute SQL File
(3) Fetch All
🖍️ Execute SQL Query(쿼리) 실행
import mysql.connector
mydb = mysql.connector.connect(
host = "<hostname>",
user = "<username>",
password = "<password>"
database = "<databasename>"
)
mycursor = mydb.cursor()
mycursor.execute(<query>);
mycursor = mydb.cursor(): 해당코드는 mydb 변수에 연결된 MySQL 데이터베이스 객체에서 cursor() 메서드를 호출하여 cursor() 객체를 생성한다.
cursor(): cursor()는 현재 접속된 데이터베이스와 상호작용해서 쿼리를 실행하고 결과를 처리하기 위한 객체 역할을 한다. cursor()를 사용하여 쿼리를 실행하고 결과를 처리할 수 있다.
mycursor.execute(<query>): 현재 접속된 데이터베이스와 연결된 객체인 mycursor를 사용하여 SQL 쿼리를 execute 함수를 사용해 실행하는 것이다. <query> 안에는 연결된 데이터베이스에 실행할 SQL 쿼리가 들어가고 쿼리를 실행하면 연결된 데이터베이스에 쿼리를 전송하고 코드 명령문을 실행한다.
🖍️ AWS RDS 데이터베이스에 접속 후 Execute SQL Query(쿼리) 실행 예제
import mysql.connector
remote = mysql.connector.connect(
host = ""database-l.cwz ...",
port = 3306,
user = "admin",
password = "password"
database = "zerobase"
)
cur = remote.cursor()
cur.execute("CREATE TABLE sql_file (id int, filename varchar(16))")
"remote"라는 변수를 사용한 것은 이 코드가 원격 MySQL 서버에 연결하는 것을 나타내기 위해서이다.
cur = remote.cursor(): remote 변수에 연결된 AWS RDS의 MySQL 데이터베이스 객체에서 cursor() 메서드를 호출해서 cur 객체를 생성한다.
cursor(): cursor()는 현재 접속된 데이터베이스와 상호작용해서 쿼리를 실행하고 결과를 처리하기 위한 객체 역할을 한다. cursor()를 사용하여 쿼리를 실행하고 결과를 처리할 수 있다.
cur.execute("CREATE TABLE sql_file (id int, filename varchar(16))"): 현재 AWS RDS의 Mysql 데이터베이스 내에 'zerobase'와 접속된 remote 변수를 담은 cur를 사용하여 execute 함수를 사용해 SQL 쿼리를 실행하는 것이다.
"CREATE TABLE sql_file (id int, filename varchar(16))" 쿼리 를 실행하면 연결된 데이터베이스인 'zerobase' 쿼리를 전송하고 코드 명령문을 실행한다.
쿼리는 sql_file 이라는 테이블을 정수 타입인 id 와 문자열 타입인 filename 이라는 행을 생성하는 쿼리이다.
반대로 삭제하는 쿼리는 "DROP TABLE sql_file" 을 사용하면 되겠다.
mysql> desc sql_file;
+-------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| filename | varchar(16) | YES | | NULL | |
+-------------+------------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
🖍️ Execute SQL File 실행
import mysql.connector
mydb = mysql.connector.connect(
host = "<hostname>",
user = "<username>",
password = "<password>"
database = "<databasename>"
)
mycursor = mydb.cursor()
sql = open("<filename>. sql").read()
mycursor.execute(sql);
mycursor = mydb.cursor(): 해당코드는 mydb 변수에 연결된 MySQL 데이터베이스 객체에서 cursor() 메서드를 호출하여 cursor() 객체를 생성한다.
cursor(): cursor()는 현재 접속된 데이터베이스와 상호작용해서 쿼리를 실행하고 결과를 처리하기 위한 객체 역할을 한다. cursor()를 사용하여 쿼리를 실행하고 결과를 처리할 수 있다.
sql = open("<filename>.sql").read(): 이 코드는 접속된 데이터베이스 외부에 존재하는 SQL 파일을 읽어와서 해당 파일의 내용을 문자열로 가져오는 것이다. <filename>.sql에는 실행하려는 명령문이 담겨있는 SQL 쿼리가 포함된 SQL File 파일의 경로가 들어가게 된다. 이를 통해 이 파일에서 쿼리를 읽어오는 작업을 수행하여 변수 sql에 저장한다.
mycursor.execute(sql): 현재 접속된 데이터베이스와 연결된 객체인 mycursor를 사용하여 SQL File 쿼리를 불러와 담은 sql 변수를 execute 함수를 사용해 실행하는 것이다. 실행을 하면 데이터베이스에 쿼리를 전송하고 SQL File에 담긴 쿼리의 명령문을 실행한다.🖍️ AWS RDS 데이터베이스에 접속 후 Execute SQL Query(쿼리) 실행 예제
1.
#test03.sql 의 쿼리
CREATE TABLE sql_file
(
id int,
filename varchar(16)
);
2.
#test03.sql 파일 실행
import mysql.connector
remote = mysql.connector.connect(
host = ""database-l.cwz ...",
port = 3306,
user = "admin",
password = "password"
database = "zerobase"
)
cur = remote.cursor()
sql = open("test03.sql").read()
cur.execute(sql)
remote.close()
"remote"라는 변수를 사용한 것은 이 코드가 원격 MySQL 서버에 연결하는 것을 나타내기 위해서이다.
cur = remote.cursor(): remote 변수에 연결된 AWS RDS의 MySQL 데이터베이스 객체에서 cursor() 메서드를 호출해서 cur 객체를 생성한다.
cursor(): cursor()는 현재 접속된 데이터베이스와 상호작용해서 쿼리를 실행하고 결과를 처리하기 위한 객체 역할을 한다. cursor()를 사용하여 쿼리를 실행하고 결과를 처리할 수 있다.
sql = open("test03.sql").read()는 접속된 데이터베이스 외부에 존재하는 test03.sql 파일을 읽어와서 해당 파일의 내용을 문자열로 가져오는 것이다. 이 파일에서 담겨있는 쿼리를 읽어오는 작업을 수행하여 변수 sql에 저장한다.
cur.execute(sql): 현재 접속된 데이터베이스와 연결된 객체인 cur를 사용하여 test03.sql에 담긴 쿼리를 불러와 담은 sql 변수를 execute 함수를 사용해 실행하는 것이다. 실행을 하면 데이터베이스에 쿼리를 전송하고 test03.sql에 담긴 쿼리의 명령문을 실행한다.
🖍️ Execute SQL Query(쿼리) 실행 SQL File 내에 Query 가 여러개 존재하는 경우 예제
#쿼리가 여러개 존재하는 test04.sql 의 쿼리
INSERT INTO sql_file VALUES (1, 'testO1-sql');
INSERT INTO sql_file VALUES (2, 'testO2.sql');
INSERT INTO sql_file VALUES (3, 'testO3-sql');
INSERT INTO sql_file VALUES (4, 'testO4.sql');
sql_file 이라는 이미 존재하는 테이블의 열(column)에 값(values)을 insert 하는 쿼리이다.#test04.sql 파일 실행
import mysql.connector
remote = mysql.connector.connect(
host = ""database-l.cwz ...",
port = 3306,
user = "admin",
password = "password"
database = "zerobase"
)
cur = remote.cursor()
sql = open("test04.sql").read()
for result_iterator in cur.execute(sql, multi=True):
if result_iterator.with_rows:
print(result_iterator.fetchall())
else:
print(resu1t_iterator.statement)
remote.commit()
remote.closet)
for result_iterator in cur.execute(sql, multi=True):: 이 코드는 현재 접속된 데이터베이스와 연결된 객체인 cur를 사용하여 test04.sql에 담긴 쿼리를 불러와 담은 sql 변수를 execute 함수를 사용해 SQL 쿼리를 실행한다. excute 에서 multi=True를 설정하면 여러 개의 쿼리를 한 번에 실행할 수 있게 된다. multi=True 옵션을 사용하는 이유는 여러 개의 쿼리를 한 번에 실행할 수 있도록 하기 위함이다. 쿼리 실행 결과는 result_iterator에 반환되게 된다. 이후에는 if else 조건문의 결과에 따라 for in 반복문을 사용하여 print 실행 결과를 처리한다.
if result_iterator.with_rows: print(result_iterator.fetchall()) : if else 조건문을 사용하여 조건에 만족했을 때 명령문을 실행한다는 것이다. ifresult_iterator.with_rows 는 현재 실행 결과에 행이 있는지 확인하는 것이다. result_iterator 에 담겨있는 결과는 test04.sql에 담긴 쿼리를 불러와 담은 sql 변수를 execute 함수를 사용해 SQL 쿼리를 실행한 결과이다. test04.sql 담긴 쿼리는 INSERT INTO 로 이루어져 있으며 이를 실행하면 추가된 행의 개수를 나타내지 SELECT와 같이 실행 결과에 행이 존재하는지 조회하거나 보여주지 않는다. 따라서 if result_iterator.with_rows: 는 False가 되어 print(result_iterator.fetchall())를 수행 할 수가 없게 된다. 만약 실행 결과에 행이 있는 경우 TRUE가 되어fetchall() 메서드를 사용하여 쿼리가 실행되고 난 후 만들어진 테이블 내의 모든 행을 가져와 출력하여 조회할 수 있다.
else: print(resu1t_iterator.statement):if else 조건문을 사용하여 조건에 만족했을 때 명령문을 실행한다는 것이다. if result_iterator.with_rows: 는 False가 되어 print(result_iterator.fetchall())를 수행 할 수가 없게 됐다.
resu1t_iterator.statement는 reulst_iterator 라는 객체를 statement 라는 구문으로 데이터베이스에서 실행된 SQL 쿼리 대한 정보를 제공한다. statement는 SQL 쿼리 자체를 의미하며 실행된 SQL 쿼리 문자열들을 출력해준다. 이 속성은 cur.execute() 메서드를 통해 반환된 Result 객체의 result_iterator 속성을 통해 접근할 수 있고, 쿼리 실행 결과를 분석하거나 조회하고 디버깅하는 데 도움이 된다.
remote.commit(): 데이터베이스에서 실행해 발생한 모든 변경사항을 커밋하여 데이터베이스에 반영하는 것이다. 이 부분은 트랜잭션을 커밋하여 데이터베이스에 영구적인 변경사항을 적용하는 역할을 한다. 트랜잭션은 데이터베이스에서 일련의 작업들을 하나의 작업 단위로 묶는 개념이다. 트랜잭션 내의 모든 작업이 성공적으로 수행되면, commit 명령을 사용하여 커밋을 하게 되고 트랜잭션을 확정한다. 이 시점에서 트랜잭션 내의 모든 변경 사항이 데이터베이스에 영구적으로 저장되는 것이다.#python에서 sql 파일 실행 결과
INSERT INTO sql_file VALUES (1, 'testO1-sql');
INSERT INTO sql_file VALUES (2, 'testO2.sql');
INSERT INTO sql_file VALUES (3, 'testO3-sql');
INSERT INTO sql_file VALUES (4, 'testO4.sql');
#MYsql내에서 sql_file 조회
mysql> select * from sql_file;
+----+------------+
| id | filename |
+----+------------+
| 1 | test01.sql |
| 2 | test02.sql |
| 3 | test03.sql |
| 4 | test04.sql |
+----+------------+
4 rows in set (0.01 sec)
fetchall 은 Mysql 데이터베이스에서 실행한 쿼리 결과의 모든 행을 한 번에 반환하는 것이다. 반환된 결과는 튜플의 리스트 형태로 저장이 되게 된다.mycursor = remote.cursor(buffered=True)
mycursor.execute(<query>)
result = mycursor.fetchall()
for data in result:
print(data)
mycursor = remote.cursor(buffered=True) : 해당 코드는 MySQL 의 커서를 생성할 때 buffered 매개변수를 True로 설정하여 버퍼링된 커서를 생성하는 것이다. buffered = TRUE는 대량의 데이터를 읽어올 때 옵션을 사용하면, 대량의 데이터를 여러 번 조회하거나 필터링해야 할 때 또는 반복적으로 데이터를 탐색하고 처리해야 할 때 유용하다.
mycursor.execute(<query>): 해당 코드는 현재 연결된 데이터베이스에 SQL 쿼리를 실행하는 명령어이다. <query> 부분에는 실행하고자 하는 SQL 쿼리가 들어간다. 예를 들어 sql_file 이라는 테이블을 조회하고 싶다면 "SELECT * FROM sql_file" 을 입력하면 된다.
result = mycursor.fetchall(): 위에서 실행한 쿼리의 결과를 모두 가져와 result에 저장하는 것이다. fetchall은 Mysql 데이터베이스에서 실행한 쿼리 결과의 모든 행을 한 번에 리스트 형태로 반환하는 것이다. 리스트의 각 요소는 데이터베이스의 테이블의 한 행을 나타내는 것으로 반환된 결과는 result 변수에 저장되게 된다.
for data in result: : result 변수내에 있는 리스트 형태로 반환된 여러 개의 테이블의 행을 출력하고 싶다면 for 반복문을 사용해 리스트들 또는 행들을 순차적으로 data 에 저장하는 것이다.SQL File의 결과물을 python에서 조회하고 싶다면 이와 같이 for 반복문을 사용하는 것이 방법이 될 수 있다.🖍️ Fetch All 실행 예제
#test04.sql 파일 실행
import mysql.connector
remote = mysql.connector.connect(
host = ""database-l.cwz ...",
port = 3306,
user = "admin",
password = "password"
database = "zerobase"
)
cur = remote.cursor(buffered=True)
cur.execute("SELECT * FROM sql_file")
result = cur.fetchall()
for result_iterator in result::
print(result_iterator)
remote.close()
(1, 'testO1.sql')
(2, 'test02.sql')
(3, 'testO3.sql')
(4, 'test04.sql')