Day 2 of 5
⏱ ~60 minutes
Flask in 5 Days — Day 2

SQLAlchemy and Databases

Connect Flask to a database via SQLAlchemy. Define models, run migrations with Flask-Migrate, and perform CRUD operations.

Setting Up SQLAlchemy

Terminal
pip install flask-sqlalchemy flask-migrate
app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
migrate = Migrate(app, db)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False)
    body = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
Terminal — Migrations
flask db init
flask db migrate -m 'initial'
flask db upgrade
CRUD in Views
# CREATE
new_post = Post(title='Hello', body='World', user_id=1)
db.session.add(new_post)
db.session.commit()

# READ
posts = Post.query.all()
post = Post.query.get_or_404(post_id)
posts = Post.query.filter_by(user_id=1).order_by(Post.id.desc()).all()

# UPDATE
post.title = 'New Title'
db.session.commit()

# DELETE
db.session.delete(post)
db.session.commit()
📝 Day 2 Exercise
Add Database to Your App
  1. S
  2. e
  3. t
  4. u
  5. p
  6. S
  7. Q
  8. L
  9. A
  10. l
  11. c
  12. h
  13. e
  14. m
  15. y
  16. w
  17. i
  18. t
  19. h
  20. a
  21. U
  22. s
  23. e
  24. r
  25. a
  26. n
  27. d
  28. P
  29. o
  30. s
  31. t
  32. m
  33. o
  34. d
  35. e
  36. l
  37. .
  38. R
  39. u
  40. n
  41. m
  42. i
  43. g
  44. r
  45. a
  46. t
  47. i
  48. o
  49. n
  50. s
  51. .
  52. A
  53. d
  54. d
  55. r
  56. o
  57. u
  58. t
  59. e
  60. s
  61. t
  62. o
  63. c
  64. r
  65. e
  66. a
  67. t
  68. e
  69. ,
  70. l
  71. i
  72. s
  73. t
  74. ,
  75. a
  76. n
  77. d
  78. d
  79. e
  80. l
  81. e
  82. t
  83. e
  84. p
  85. o
  86. s
  87. t
  88. s
  89. .
  90. U
  91. s
  92. e
  93. <
  94. c
  95. o
  96. d
  97. e
  98. >
  99. g
  100. e
  101. t
  102. _
  103. o
  104. r
  105. _
  106. 4
  107. 0
  108. 4
  109. <
  110. /
  111. c
  112. o
  113. d
  114. e
  115. >
  116. f
  117. o
  118. r
  119. t
  120. h
  121. e
  122. d
  123. e
  124. t
  125. a
  126. i
  127. l
  128. v
  129. i
  130. e
  131. w
  132. .

Day 2 Summary

  • db = SQLAlchemy(app) and model classes that extend db.Model. Fields are class attributes.
  • flask db migrate + flask db upgrade — run every time you change a model.
  • db.session.add(obj) + db.session.commit() to save. db.session.delete(obj) to remove.
  • Relationships: db.ForeignKey on the child + db.relationship on the parent for easy traversal.
Finished this lesson?