목차
[Python] flask와 sqlite 연동: Database Write 하기: 예제1
혹시 전체 코드에 대해 자세히 알고 싶으시면 sqlite 카테고리의 글을 처음부터 보시면 쉽게 따라 오실 수 있습니다.
앞서 포스트에서는 flask와 sqlite를 연동해서 데이터베이스의 값을 읽어 오거나 HTTP GET을 사용해서 특정 ID의 DB값을 읽어 오는 방법에 대해 알아 보았습니다(https://scribblinganything.tistory.com/623).
이번 포스트에서는 두가지 예제에 대해 실행하겠습니다.
- 특정 페이지 접속 시 파이썬 코드에 저장되어 있는 리스트 값을 데이터베이스에 올리기
- 웹페이지에 직접 데이터베이스에 올릴 값 입력해서 flask와 sqlite 연동으로 DB에 저장하기
우선 첫번째 예제의 전체 코드는 아래와 같습니다.
현재 employee 데이터 베이스에 저장된 DB 내용>>
sql_read.html>>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>sql_read</title>
</head>
<body>
<table border="1">
<tr>
<th>ID</th>
<th>이름</th>
<th>주소</th>
</tr>
{% for item in items %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.name }}</td>
<td>{{ item.addr }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
파이썬 메인 코드>>
from flask import Flask, render_template, abort, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///D:\\Python\\test04\\company.db'
app.config['SECRET_KEY'] = "my_secret"
# app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////home/fam/linux_test/flask_test/company.db'
db = SQLAlchemy(app)
class employee(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True, nullable=False)
addr = db.Column(db.String)
def __init__(self, id=1, name=None, addr=None):
self.id = id
self.name = name
self.addr = addr
def __repr__(self):
return '<%r, %r>' % (self.name,self.addr)
@app.route('/sql_search/<id>')
def sql_search(id):
db_value = db.session.execute("SELECT * from employee where id like "+"'%"+id+"%'").fetchall()
if db_value:
return render_template('sql_read.html', items=db_value)
return abort(404, "no database")
@app.route('/sql_read')
def sql_read():
db_value = db.session.query(employee).all()
if db_value:
return render_template('sql_read.html', items=db_value)
return abort(404, "no database")
@app.route('/sql_write')
def insert_one():
new_data = employee(9,'Shawn', 'Chicago')
db.session.add(new_data)
db.session.commit()
flash('DB is saved')
return redirect(url_for('sql_read'))
@app.route('/')
def hello_fnc():
return "Hello"
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=True, port=9999)
이전과 동일한 내용의 코드에 대한 설명은 생략 하겠습니다.
@app.route('/sql_write')
def insert_one():
new_data = employee(9,'Shawn', 'Chicago')
db.session.add(new_data)
db.session.commit()
flash('DB is saved')
return redirect(url_for('sql_read'))
기존의 코드에서 위의 내용이 저장되었습니다.
1번 라인: sql_write 페이지에 접속시 아래의 함수가 실행됩니다.
3번 라인: 저장할 리스트(list) 값을 employee 클래스(Class) 안에 넣어 줍니다.
5~6번 라인: 데이터를 DB에 추가 해줍니다.
8번 라인: 추가 결과를 sql_read.html에서 보여 줍니다.
결과>>
sql_write 접속 후 위와 같은 페이지와 데이터가 추가된 것을 확인할 수 있습니다.
[Python] flask와 sqlite 연동: Database Write 하기: 예제2
이번에는 웹페이지에서 직접 데이터베이스(Database)로 값을 입력하는 방법에 대해 알아보겠습니다.
sql_write.html>>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>sql_write</title>
</head>
<body>
{%- for category, message in get_flashed_messages(with_categories = true) %}
<div class = "alert alert-danger">
{{ message }}
</div>
{%- endfor %}
<form action = "{{ request.path }}" method = "post">
<label for = "id">id</label><br>
<input type = "text" name = "id" placeholder = "id" /><br>
<label for = "name">name</label><br>
<input type = "text" name = "name" placeholder = "name" /><br>
<label for = "addr">addr</label><br>
<textarea name = "addr" placeholder = "addr"></textarea><br>
<input type = "submit" value = "Submit" />
</form>
</body>
</html>
DB 값을 HTTP POST로 전달 받을 수 있게 form을 작성 해줍니다.
파이썬 메인 코드>>
from flask import Flask, render_template, abort, redirect, url_for, flash, request
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///D:\\Python\\test04\\company.db'
# app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////home/fam/linux_test/flask_test/company.db'
app.config['SECRET_KEY'] = "my_secret"
db = SQLAlchemy(app)
class employee(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True, nullable=False)
addr = db.Column(db.String)
def __init__(self, id=1, name=None, addr=None):
self.id = id
self.name = name
self.addr = addr
def __repr__(self):
return '<%r, %r>' % (self.name,self.addr)
@app.route('/sql_search/<id>')
def sql_search(id):
db_value = db.session.execute("SELECT * from employee where id like "+"'%"+id+"%'").fetchall()
if db_value:
return render_template('sql_read.html', items=db_value)
return abort(404, "no database")
@app.route('/sql_read')
def sql_read():
db_value = db.session.query(employee).all()
if db_value:
return render_template('sql_read.html', items=db_value)
return abort(404, "no database")
@app.route('/sql_write', methods = ['GET', 'POST'])
def insert_one():
if request.method == 'POST':
if not request.form['id'] or not request.form['name'] or not request.form['addr']:
flash('Fill up the form', 'error')
else:
new_data = employee(int(request.form['id']),request.form['name'],request.form['addr'])
db.session.add(new_data)
db.session.commit()
flash('DB is saved')
return redirect(url_for('sql_read'))
return render_template('sql_write.html')
@app.route('/')
def hello_fnc():
return "Hello"
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=True, port=9999)
추가된 코드는 아래와 같습니다.
@app.route('/sql_write', methods = ['GET', 'POST'])
def insert_one():
if request.method == 'POST':
if not request.form['id'] or not request.form['name'] or not request.form['addr']:
flash('Fill up the form', 'error')
else:
new_data = employee(int(request.form['id']),request.form['name'],request.form['addr'])
db.session.add(new_data)
db.session.commit()
flash('DB is saved')
return redirect(url_for('sql_read'))
return render_template('sql_write.html')
1번 라인: sql_write에 접속하고 HTTP method가 GET이거나 POST일때 아래 함수를 실행합니다.
3~11번 라인: POST일 경우 form으로 부터 값을 전달 받아서 데이터베이스에 저장하고 sql_read 페이지로 넘어 갑니다.
12번 라인: GET인 경우 sql_write.html 페이지를 열어 줍니다.
결과>>
id는 10로 name은 Harry로 addr는 Texas로 입력하고 submit 버튼을 눌러 줍니다.
정상적으로 값이 출력 됨을 알 수 있습니다.
'데이터베이스(db) > SQLite' 카테고리의 다른 글
[Python] flask와 sqlite 연동 검색(GET, response) (0) | 2022.11.08 |
---|---|
[Python]flask와 sqlite(데이터베이스) 연결하고 웹화면에 띄우기 (0) | 2022.11.04 |
[Python] Sqlalchemy로 데이터베이스 읽기, 조건문 설정하기 (0) | 2022.10.21 |
[Python] SQLAlchemcy란? 테이블 생성, 데이터 입력(SQLite, ORM) (0) | 2022.10.19 |
[Python] SQLite, CSV 쓰고 읽기, DB에 옮기기 (0) | 2022.09.27 |