파이썬에서 mysql에 데이터 insert하는 방법
1. SQL 문 작성
insert into mysql_table(column1, column2,...)
values (value1, value2,...);
2. connection으로부터 cursor가져오기
connection.cursor()
3. 쿼리 실행
cursor().execute()
4. 커밋 실행하여 인서트 반영
commit()
5. 몇개의 행이 적용됐는지 확인
cursor.rowcount
샘플코드: 변수없음
import mysql.connector
try:
## 커넥션 코드
connection = mysql.connector.connect(
host = 'yeo*******.rds.amazonaws.com',
database = 'recipe_db1',
user = 'recipe_user',
password = 'yes1’' )
# 쿼리문
query = '''insert into recipe
(name, description, cook_time, directions)
values
('된장찌개','맛있는 된장찌개 만드는 방법', 30, '먼저 고기를 볶은 후, 물을 넣고, 된장넣고, 끓인다');'''
# DB 접속하여 실행
cursor = connection.cursor()
cursor.execute(query)
connection.commit()
cursor.close()
connection.close()
except mysql.connector.Error as e:
print(e)
cursor.close()
connection.close()
finally:
if connection.is_connected():
cursor.close()
connection.close()
print
샘플코드: 변수있음
import mysql.connector
try:
# 커넥션 코드
connection = mysql.connector.connect(
host = 'yeo*******.rds.amazonaws.com',
database = 'recipe_db1',
user = 'recipe_user',
password = 'yes1’' )
# 쿼리문
cursor = connection.cursor()
query = '''insert into recipe
(name, description, cook_time, directions)
values
(%s,%s,%s,%s);'''
record = (name, description, cook_time, directions)
cursor.execute(query,record)
connection.commit()
cursor.close()
connection.close()
except mysql.connector.Error as e:
print(e)
cursor.close()
connection.close()
finally:
if connection.is_connected():
cursor.close()
connection.close()
print
- Placeholder
- 실제 업무에서 대부분의 SQL 문장에는 동적으로 컬럼 데이타값을 집어 넣어야 하는 경우가 상당히 많다. 동적 SQL문을 구성하기 위해서 파라미터값이 들어가는 위치에 Parameter Placeholder인 %s (MySql의 경우)를 넣고, execute() 메서드의 두번째 파라미터에 실제 파라미터값들의 Tuple을 넣어 주면 된다.
- 예를 들어, 아래 예제에서 SELECT 문의 WHERE 절을 보면 category와 region 값이 들어가는 곳에 각각 %s 를 넣어 주었다. 그리고 execute() 메서드에서 첫번째 파라미터에는 SQL문을, 두번째 파라미터에는 (1, '서울') 이라는 파라미터값 튜플을 넣어 주었다.
sql = "select * from customer where category=%s and region=%s" cursor.execute(sql, (1, '서울')) |
- 튜플 안의 데이타는 SQL문에서 순서대로 적용되게 되는데, 특히 문자열의 경우 단일인용부호(Single Quote)와 같은 특수 문자들이 자동으로 Escape 되어 처리된다.
Parameter Placeholder로 %s 를 사용하는데, 이 %s 는 일반 문자열 포맷팅에 사용하는 %s, %d 등과는 다른 것이다.
- Parameter Placeholder에서는 문자열이건 숫자이건 모두 %s 를 사용하며, 문자열이라도 %s를 인용부호로 둘러싸지 않는다. 또한 한가지 주의할 점은 Placeholder는 컬럼값을 대치할 때만 사용될 수 있다. 즉 테이블이나 기타 문장에 Placeholder 를 사용할 수 없다.
- 만약 Python 문자열에서 사용하는 기본 String Interpolation을 사용하면 데이타에 특수 문자가 있는 경우 SQL문 문법 오류를 발생시킬 수 있다.
- 예를 들어, 아래는 기본 String Interpolation을 사용한 예인데, 변수 data 안에 단일 인용부호가 있는 경우 SQL Syntax 에러를 유발시키게 된다. 또한 이러한 String Interpolation 혹은 문자열 결합(Concatenation)을 통해 동적 SQL 문을 만드는 방법은 SQL Injection 공격에 쉽게 노출되는 문제점이 있다.
# 잘못된 표현
data = '서\'울'
sql = "select * from customer where category=%s and region=%s" % (1, data)
curs.execute(sql)
샘플코드: 여러 행을 한번에 인서트 하는 방법
query = '''insert into recipe (name, description, cook_time, directions) values (%s,%s,%s,%s);''' # 리스트로 만들어서 넣는다. record_to_list = [("참치찌개", "맛있게 끓인다", 30, "이렇게 저렇게 끓인다."), ("참치전", "맛있게 부친다", 40, "이렇게 저렇게 부친다."), ("고등어구이", "맛있게 굽는다", 40, "이렇게 저렇게 굽는다.")] cursor.execute(query,record_to_list) |
Date Time/Timestamp를 insert 하는 방법
샘플코드:
query = '''insert into recipe
(name, description, cook_time, cooked_date)
values
(%s,%s,%s,%s);'''
cursor = connection.cursor()
current_date = datetime.now()
data = ("떡볶이","국물 떡볶이 맛나다",20,current_date)
result = cursor.execute(query, data)
connection.commit()
- 파이썬에서 시간 데이터를 내가 원하는 문자열로 만들고 싶으면 하기처럼 작성하자
formatted_date = current_date.strftime('%Y-%m-%d %H:%M:%S')
'BackEnd > Python-Flask' 카테고리의 다른 글
[백엔드] Flask: Python 으로 DB 삭제, delete (0) | 2022.06.26 |
---|---|
[백엔드] Flask: Python 으로 DB 수정, Update (0) | 2022.06.26 |
[백엔드] Flask: Python으로 DB접속/이용순서 (0) | 2022.06.26 |
[백엔드] Flask: request.get_jason() (0) | 2022.06.21 |
[백엔드] Flask: return 타입, jsonify() (0) | 2022.06.21 |