[Flask] (5) RDB - Flask Connection & κ²μν μμ
π RDB
λ°μ΄ν°λ² μ΄μ€(DataBase)μ μ’ λ₯λ ν¬κ² 1. κ΄κ³ν λ°μ΄ν°λ² μ΄μ€(RDB, 2. NoSQL(Not Only SQL)λ‘ λλλ€.
RDB(Relation Database)λ κ΄κ³ν λ°μ΄ν° λͺ¨λΈμ κΈ°λ°μΌλ‘ ν λ°μ΄ν° λ² μ΄μ€λ€.
λ€μ λ§ν΄, ν€(Key) - κ°(Value)λ€μ κ°λ¨ν κ΄κ³λ₯Ό ν
μ΄λΈνν λ°μ΄ν°λ² μ΄μ€λ€. RDBλ λ€μ νΉμ§μ κ°μ§λ€.
- λ°μ΄ν° λ 립μ±μ΄ λλ€.
- κ³ μμ€μ DMLμ μ¬μ©ν΄μ, κ²°ν©, μ μ, ν¬μ λ±μ κ΄κ³ μ‘°μμ μν΄ λΉμ½μ μΌλ‘ νν λ₯λ ₯μ λμΌ μ μλ€.
- μ΄λ€μ κ΄κ³ μ‘°μμ μν΄ μμ λ‘κ² κ΅¬μ‘°λ₯Ό λ³κ²½ν μ μλ€.
π‘ RDBμ μ’ λ₯
- Oracle
- MySQL
- MS-SQL
- DB2
- Maria DB
- Derby
- SQLite
π RDBμ Flaskμ μνΈμμ©
Flaskμμ RDBλ₯Ό μ°λνλ©΄ μ΄λ»κ² λ κΉ ? Flaskμμ μ λ ₯ λ°μ λ΄μ©λ€μ DBμ μ μ₯ν μ μμ΄μΌ νλ€.
= ν¨μ¨μ μΈ λ°μ΄ν° κ΄λ¦¬ κΈ°λ₯ μ 곡
νμ΄μ¬μ μ€ν μμ€μ μμ© λ°μ΄ν°λ² μ΄μ€μ λν λλΆλΆμ λ°μ΄ν°λ² μ΄μ€ μμ§μ μν ν¨ν€μ§λ₯Ό κ°μ§κ³ μλ€.
μμΌλ‘μ ν¬μ€ν
μμλ κ·Έ μ€, sqlite3 μ Flask μ΄ν리μΌμ΄μ
μμ μλ SQLAlchemyλ₯Ό μ¬μ©ν΄μ μ§ννλ€.
SQLAlchemyλ νμ΄μ¬ μ½λμ DBμ μ°κ²°νκΈ° μν΄ μ¬μ©λλ λΌμ΄λΈλ¬λ¦¬λ€.
π Flask - RDB μμ : κ²μν ꡬννκΈ°
π‘ DB μ¬μ©μ μΆκ°
from flask import Flask, render_template, request, url_for, redirect
import sqlite3 # salite3
app = Flask(__name__)
conn = sqlite3.connect("database.db") # splite3 db μ°κ²°
print("Opened database successfully")
conn.execute("CREATE TABLE IF NOT EXISTS Board(name TEXT, context TEXT)") # Board λΌλ DBμμ±
print("TABLE Created Successfully")
name = [
["Elice", 15],
["Dodo", 16],
["checher", 17],
["Queen", 18]
]
for i in range(len(name)):
conn.execute(f"INSERT INTO Board(name,context) VALUES('{name[i][0]}', '{name[i][1]}')") # Board DBμ λ°μ΄ν° μ½μ
conn.commit() # μ§κΈκ» μμ±ν SQL, DBμ λ°μ commit
conn.close() # μμ± λ€ν DBλ λ«μμ€μΌν¨ close
# ================= μ¬κΈ°μλΆν°λ λ€μ Flask μμ ==========================
@app.route('/')
def board():
con = sqlite3.connect("database.db")
cur = con.cursor()
cur.execute("SELECT * FROM Board")
rows = cur.fetchall()
print("DB: ")
for i in range(len(rows)):
print(rows[i][0] + ':' + rows[i][1])
return render_template("board1.html", rows = rows)
@app.route("/search", methods=["GET","POST"])
def search():
if request.method == "POST":
name = request.form["name"] # search.html κ°λ³΄λ©΄, formμ nameλ§ λ°κΈ°λ‘ ν¨.
con = sqlite3.connect("database.db")
cur = con.cursor()
cur.execute(f"SELECT * FROM Board WHERE name='{name}'")
rows = cur.fetchall()
print("DB : ")
for i in range(len(rows)):
print(rows[i][0] + ':' + rows[i][1])
return render_template("search.html", rows=rows)
else:
return render_template("search.html")
@app.route("/add", methods=["GET","POST"])
def add():
if request.method == "POST":
try:
name = request.form["name"]
context = request.form["context"]
# DBμ μ κ·Όν΄μ, λ°μ΄ν°λ₯Ό μ½μ
ν λλ, μ§μ DBλ₯Ό μ΄μ΄μΌλλλ°, μ κ³Όμ μ²λΌ, closeκΉμ§ νκΈ° νλλκΉ, νλ λ°©μ, κ²°κ³Όλ κ°μ κ² !
with sqlite3.connect("database.db") as con:
cur = con.cursor()
cur.execute(f"INSERT INTO Board(name,context) VALUES('{name}','{context}')")
con.commit()
except:
con.rollback() # DB λ‘€λ°±ν¨μ, SQLμ΄ μ€λ₯λλ©΄, λ°μμ , μ΄μ μνλ‘ λ리λ κ²
finally:
return redirect(url_for("board"))
else:
return render_template("add.html")
if __name__ == '__main__':
app.run()
<!-- ./templates/board1.html -->
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>SQLite3 κ²μν λ±λ‘</title>
<style type="text/css">
body {
text-align: center;
}
</style>
</head>
<body>
<h3>κ²μν</h3>
<h4><a href="{{url_for('add')}}">μΆκ°</a> <a href="{{url_for('search')}}">κ²μ</a><br><br>λͺ©λ‘</h4>
<table border=1 width="600" align="center">
<thead>
<td>μ΄λ¦</td>
<td>λ΄μ©</td>
</thead>
{% for row in rows %}
<tr>
<td>{{ row[0] }}</td>
<td>{{ row[1] }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
<!-- ./templates/add.html -->
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>SQLite3 κ²μν λ±λ‘</title>
<style type="text/css">
body {
text-align: center;
}
</style>
</head>
<body>
<h3>κ²μν</h3>
<h4>μΆκ°</h4>
<form action="/add" method="POST">
μ΄λ¦<br>
<input type="text" name="name" /><br>
λ΄μ©<br>
<input type="text" name="context" style="text-align:center; width:400px; height:100px;" /><br><br>
<input type="submit" value="κ² μ" /><br>
</form>
</body>
</html>
<!-- ./templates/search.html -->
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>SQLite3 κ²μν λ±λ‘</title>
<style type="text/css">
body {
text-align: center;
}
</style>
</head>
<body>
<form action="/search" method="POST">
<input type="text" name="name" />
<input type="submit" value="κ² μ" /><br>
</form>
<h4>κ²μκ²°κ³Ό</h4>
{% if rows%}
<table border=1 width="600" align="center">
<thead>
<td>μ΄λ¦</td>
<td>λ΄μ©</td>
</thead>
{% for row in rows %}
<tr>
<td>{{ row[0] }}</td>
<td>{{ row[1] }}</td>
</tr>
{% endfor %}
{% else %}
<p> κ²μκ²°κ³Όκ° μμ΅λλ€. </p>
{% endif %}
</table>
</body>
</html>
π‘ μ€λ³΅ μ¬μ©μ μ μ΄ ( μμ, DB μ¬μ©μ μΆκ°μμ λ³ν μ½λλ λͺ μμ
from flask import Flask, render_template, request, url_for, redirect
import sqlite3 # salite3
app = Flask(__name__)
conn = sqlite3.connect("database.db") # splite3 db μ°κ²°
print("Opened database successfully")
conn.execute("CREATE TABLE IF NOT EXISTS Board(name TEXT, context TEXT)") # Board λΌλ DBμμ±
print("TABLE Created Successfully")
name = [
["Elice", 15],
["Dodo", 16],
["checher", 17],
["Queen", 18]
]
for i in range(len(name)):
conn.execute(f"INSERT INTO Board(name,context) VALUES('{name[i][0]}', '{name[i][1]}')") # Board DBμ λ°μ΄ν° μ½μ
conn.commit() # μ§κΈκ» μμ±ν SQL, DBμ λ°μ commit
conn.close() # μμ± λ€ν DBλ λ«μμ€μΌν¨ close
# ================= μ¬κΈ°μλΆν°λ λ€μ Flask μμ ==========================
@app.route('/')
def board():
con = sqlite3.connect("database.db")
cur = con.cursor()
cur.execute("SELECT * FROM Board")
rows = cur.fetchall()
print("DB: ")
for i in range(len(rows)):
print(rows[i][0] + ':' + rows[i][1])
return render_template("board1.html", rows = rows)
@app.route("/search", methods=["GET","POST"])
def search():
if request.method == "POST":
name = request.form["name"] # search.html κ°λ³΄λ©΄, formμ nameλ§ λ°κΈ°λ‘ ν¨.
con = sqlite3.connect("database.db")
cur = con.cursor()
cur.execute(f"SELECT * FROM Board WHERE name='{name}'")
rows = cur.fetchall()
print("DB : ")
for i in range(len(rows)):
print(rows[i][0] + ':' + rows[i][1])
return render_template("search.html", rows=rows)
else:
return render_template("search.html", msg ="κ²μμ΄λ₯Ό μ
λ ₯ν΄μ£ΌμΈμ.")
@app.route("/add", methods=["GET","POST"])
def add():
if request.method == "POST":
name = request.form["name"]
context = request.form["context"]
# DBμ μ κ·Όν΄μ, λ°μ΄ν°λ₯Ό μ½μ
ν λλ, μ§μ DBλ₯Ό μ΄μ΄μΌλλλ°, μ κ³Όμ μ²λΌ, closeκΉμ§ νκΈ° νλλκΉ, νλ λ°©μ, κ²°κ³Όλ κ°μ κ² !
with sqlite3.connect("database.db") as con:
cur = con.cursor()
cur.execute(f"SELECT count(*) FROM Board WHERE name='{name}'")
# νμ νλͺ
, μΆκ°ν λΌ νλλ°, κ·Έμ μ λ€μ΄μ¨, nameκ°μ΄λ κ°μ μ΄λ¦μ΄ DBμ μμΌλ©΄, μ€λ³΅νμμμ΄λ―λ‘, λͺ»νκ² μ μ΄ν¨
if cur.fetchall()[0][0] == 0: # μ€λ³΅μ΄λ¦μ΄ μμΌλ©΄
cur.execute(f"INSERT INTO Board(name,context) VALUES('{name}','{context}')")
con.commit()
cur.execute("SELECT * FROM Board")
rows = cur.fetchall()
return render_template("board1.html",rows= rows)
else: # μ€λ³΅μ΄λ¦μ΄ μμΌλ©΄
return render_template("add.html",msg = "μ€λ³΅μ¬μ©μκ° μμ΅λλ€.")
else:
return render_template("add.html")
if __name__ == '__main__':
app.run()
<!-- ./templates/board1.html -->
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>SQLite3 κ²μν λ±λ‘</title>
<style type="text/css">
body {
text-align: center;
}
</style>
</head>
<body>
<h3>κ²μν</h3>
<h4><a href="{{url_for('add')}}">μΆκ°</a> <a href="{{url_for('search')}}">κ²μ</a><br><br>λͺ©λ‘</h4>
<table border=1 width="600" align="center">
<thead>
<td>μ΄λ¦</td>
<td>λ΄μ©</td>
</thead>
{% for row in rows %}
<tr>
<td>{{ row[0] }}</td>
<td>{{ row[1] }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
<!-- ./templates/add.html -->
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>SQLite3 κ²μν λ±λ‘</title>
<style type="text/css">
body {
text-align: center;
}
</style>
</head>
<body>
<h3>κ²μν</h3>
<h4>μΆκ°</h4>
<form action="/add" method="POST">
μ΄λ¦<br>
<input type="text" name="name" /><br>
λ΄μ©<br>
<input type="text" name="context" style="text-align:center; width:400px; height:100px;" /><br><br>
<input type="submit" value="κ² μ" /><br>
</form>
{% if msg %}
<p> {{ msg }} </p>
{% endif %}
</body>
</html>
<!-- ./templates/reaserch.html -->
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>SQLite3 κ²μν λ±λ‘</title>
<style type="text/css">
body {
text-align: center;
}
</style>
</head>
<body>
<form action="/search" method="POST">
<input type="text" name="name" />
<input type="submit" value="κ² μ" /><br>
</form>
<h4>κ²μκ²°κ³Ό</h4>
{% if rows%}
<table border=1 width="600" align="center">
<thead>
<td>μ΄λ¦</td>
<td>λ΄μ©</td>
</thead>
{% for row in rows %}
<tr>
<td>{{ row[0] }}</td>
<td>{{ row[1] }}</td>
</tr>
{% endfor %}
{% elif msg %}
<p> {{ msg }} </p>
{% else %}
<p> κ²μκ²°κ³Όκ° μμ΅λλ€. </p>
{% endif %}
</table>
</body>
</html>
π‘ κ²μν λ΄μ© μμ± λ° μ‘°ν
μμμ, DB μ¬μ©μ μμ±, μ€λ³΅μ κ±° λ΄μ©κ³Ό λμΌ
π‘ κ²μν λ΄μ© μμ λ° μμ
#DATABASE
from flask import Flask, render_template, request, url_for, redirect
import sqlite3
app = Flask(__name__)
conn = sqlite3.connect('database.db')
print ("Opened database successfully")
conn.execute("DROP TABLE IF EXISTS Board") # Board ν
μ΄λΈμ΄ κΈ°μ‘΄μ μλ€λ©΄ μμ (λ§€λ², λμΌν νμΌμμ μ€ννλ©΄, λ΄μ©μ΄ κ²Ήμ³μ λ§λ¦)
conn.execute('CREATE TABLE IF NOT EXISTS Board (name TEXT, context TEXT)') # Board ν
μ΄λΈμ΄ κΈ°μ‘΄μ μλ€λ©΄ μμ±
print ("Table created successfully")
name = [['Elice', 15], ['Dodo', 16], ['Checher', 17], ['Queen', 18]]
for i in range(4):
conn.execute(f"INSERT INTO Board(name, context) VALUES('{name[i][0]}', '{name[i][1]}')")
conn.commit()
conn.close()
# root = home
@app.route('/')
def board():
con = sqlite3.connect("database.db")
cur = con.cursor()
cur.execute("select * from Board")
rows = cur.fetchall()
print("DB:")
for i in range(len(rows)):
print(rows[i][0] + ':' + rows[i][1])
return render_template('board1.html', rows = rows)
# κ²μλ¬Ό μ‘°ν (Read)
@app.route('/search', methods = ['GET', 'POST'])
def search():
if request.method == 'POST':
name = request.form['name']
con = sqlite3.connect("database.db")
cur = con.cursor()
cur.execute(f"SELECT * FROM Board WHERE name='{name}' or context='{name}'")
rows = cur.fetchall()
print("DB:")
for i in range(len(rows)):
print(rows[i][0] + ':' + rows[i][1])
return render_template('search.html', rows = rows)
else:
return render_template('search.html')
# κ²μλ¬Ό μμ± (Create)
@app.route('/add', methods = ['GET', 'POST'])
def add():
if request.method == 'POST':
try:
name = request.form['name']
context = request.form['context']
with sqlite3.connect("database.db") as con:
cur = con.cursor()
cur.execute(f"INSERT INTO Board (name, context) VALUES ('{name}', '{context}')")
con.commit()
except:
con.rollback()
finally :
con.close()
return redirect(url_for('board'))
else:
return render_template('add.html')
# μμ μ‘°ν, μμ±μ μ΄μ κ³Ό λμΌ
# κ²μλ¬Ό λ΄μ© κ°±μ (Update)
@app.route("/update/<uid>", methods=["GET","POST"])
def update(uid):
if request.method == "POST":
name = request.form["name"]
context = request.form["context"]
# λ΄μ© κ°±μ νκ³
with sqlite3.connect("database.db") as con:
cur = con.cursor() # connectionν dbμ μ κ·ΌνκΈ° μν΄, cursor κ°μ²΄ λ§λ€κΈ°
cur.execute(f"UPDATE Board SET name='{name}', context='{context}' WHERE name='{uid}'")
con.commit()
return redirect(url_for("board")) # κ°±μ λμλμ§, boardν¨μ 리λ€μ΄λ νΈν΄μ, / νμ΄μ§ λ λλ§
else:
con = sqlite3.connect("database.db")
cur = con.cursor()
cur.execute(f"SELECT * FROM Board WHERE name='{uid}'")
row = cur.fetchall()
return render_template("update.html",row=row)
@app.route("/delete/<uid>")
def delete(uid):
# λ€μ΄μ¨ uid κ°μ΄λ nameμ΄λ delete μ°μ°νκ³ λ°μ
with sqlite3.connect("database.db") as con:
cur = con.cursor()
cur.execute(f"DELETE FROM Board WHERE name='{uid}'")
con.commit()
return redirect(url_for('board')) # μμ λ°μνκ³ , λ°μλ¬λμ§, boardν¨μ 리λ€μ΄λ νΈ, / νμ΄μ§ λ λλ§
if __name__ == '__main__':
app.run()
<!-- ./templates/board1.html -->
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>SQLite3 κ²μν λ±λ‘</title>
<style type="text/css">
body {
text-align: center;
}
</style>
</head>
<body>
<h3>κ²μν</h3>
<h4><a href="{{url_for('add')}}">μΆκ°</a> <a href="{{url_for('search')}}">κ²μ</a><br><br>λͺ©λ‘</h4>
<table border=1 width="600" align="center">
<thead>
<td>μ΄λ¦</td>
<td>λ΄μ©</td>
<td>μμ /μμ </td>
</thead>
{% for row in rows %}
<tr>
<td>{{ row[0] }}</td>
<td>{{ row[1] }}</td>
<td><a href="{{url_for('update', uid = row[0])}}">μμ </a> <a
href="{{url_for('delete', uid = row[0])}}">μμ </a></td>
</tr>
{% endfor %}
</table>
</body>
</html>
<!-- ./templates/add.html -->
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>SQLite3 κ²μν λ±λ‘</title>
<style type="text/css">
body {
text-align: center;
}
</style>
</head>
<body>
<h3>κ²μν</h3>
<h4>μΆκ°</h4>
<form action="/add" method="POST">
μ΄λ¦<br>
<input type="text" name="name" /><br>
λ΄μ©<br>
<input type="text" name="context" style="text-align:center; width:400px; height:100px;" /><br><br>
<input type="submit" value="κ² μ" /><br>
</form>
</body>
</html>
<!-- ./templates/research.html -->
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>SQLite3 κ²μν λ±λ‘</title>
<style type="text/css">
body {
text-align: center;
}
</style>
</head>
<body>
<form action="/search" method="POST">
<input type="text" name="name" />
<input type="submit" value="κ² μ" /><br>
</form>
<h4>κ²μκ²°κ³Ό</h4>
{% if rows%}
<table border=1 width="600" align="center">
<thead>
<td>μ΄λ¦</td>
<td>λ΄μ©</td>
</thead>
{% for row in rows %}
<tr>
<td>{{ row[0] }}</td>
<td>{{ row[1] }}</td>
</tr>
{% endfor %}
{% else %}
<p> κ²μκ²°κ³Όκ° μμ΅λλ€. </p>
{% endif %}
</table>
</body>
</html>
<!-- ./templates/update.html -->
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>SQLite3 κ²μν λ±λ‘</title>
<style type="text/css">
body {
text-align: center;
}
</style>
</head>
<body>
<h3>κ²μν</h3>
<h4>μμ </h4>
<form action="" method="POST">
μ΄λ¦<br>
<input type="text" name="name" /><br>
λ΄μ©<br>
<input type="text" name="context" style="text-align:center; width:400px; height:100px;" /><br><br>
<input type="submit" value="μ μ " /><br>
</form>
<h4>κΈ°μ‘΄</h4>
<table border=1 width="600" align="center">
<thead>
<td>μ΄λ¦</td>
<td>λ΄μ©</td>
</thead>
<tr>
<td>{{ row[0][0] }}</td>
<td>{{ row[0][1] }}</td>
</tr>
</table>
</body>
</html>