flaskCrud
Flask>=2.0
Flask-SQLAlchemy>=3.0
Flask-Migrate>=4.0
pyodbc>=4.0
# pip install -r requirements.txt
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), nullable=False)
email = db.Column(db.String(100), nullable=False)
with app.app_context():
db.create_all()
print("Tables created!")
from flask import Flask, render_template_string, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
# SQLite local DB file
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
migrate = Migrate(app, db)
# User model
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), nullable=False)
email = db.Column(db.String(100), nullable=False)
# Bootstrap CSS link
bootstrap_css = '''
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
'''
INDEX_TEMPLATE = bootstrap_css + '''
<div class="container mt-4">
<h2>User Management (Flask-Migrate + ORM)</h2>
<hr>
<h4>Add User</h4>
<form method="POST" action="{{ url_for('add_user') }}">
<div class="mb-3">
<input type="text" class="form-control" name="username" placeholder="Username" required>
</div>
<div class="mb-3">
<input type="email" class="form-control" name="email" placeholder="Email" required>
</div>
<button type="submit" class="btn btn-primary">Add User</button>
</form>
<hr>
<h4>Users List</h4>
<table class="table table-striped">
<thead>
<tr><th>ID</th><th>Username</th><th>Email</th><th>Actions</th></tr>
</thead>
<tbody>
{% for user in users %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.username }}</td>
<td>{{ user.email }}</td>
<td>
<a href="{{ url_for('edit_user', user_id=user.id) }}" class="btn btn-sm btn-warning">Edit</a>
<a href="{{ url_for('delete_user', user_id=user.id) }}" class="btn btn-sm btn-danger" onclick="return confirm('Delete this user?')">Delete</a>
</td>
</tr>
{% else %}
<tr><td colspan="4">No users found.</td></tr>
{% endfor %}
</tbody>
</table>
</div>
'''
EDIT_TEMPLATE = bootstrap_css + '''
<div class="container mt-4">
<h2>Edit User</h2>
<hr>
<form method="POST" action="{{ url_for('edit_user', user_id=user.id) }}">
<div class="mb-3">
<input type="text" class="form-control" name="username" value="{{ user.username }}" required>
</div>
<div class="mb-3">
<input type="email" class="form-control" name="email" value="{{ user.email }}" required>
</div>
<button type="submit" class="btn btn-success">Update User</button>
<a href="{{ url_for('index') }}" class="btn btn-secondary">Cancel</a>
</form>
</div>
'''
@app.route('/')
def index():
users = User.query.all()
return render_template_string(INDEX_TEMPLATE, users=users)
@app.route('/add', methods=['POST'])
def add_user():
username = request.form['username']
email = request.form['email']
new_user = User(username=username, email=email)
db.session.add(new_user)
db.session.commit()
return redirect(url_for('index'))
@app.route('/edit/<int:user_id>', methods=['GET', 'POST'])
def edit_user(user_id):
user = User.query.get_or_404(user_id)
if request.method == 'POST':
user.username = request.form['username']
user.email = request.form['email']
db.session.commit()
return redirect(url_for('index'))
return render_template_string(EDIT_TEMPLATE, user=user)
@app.route('/delete/<int:user_id>')
def delete_user(user_id):
user = User.query.get_or_404(user_id)
db.session.delete(user)
db.session.commit()
return redirect(url_for('index'))
app.run(debug=True, host='0.0.0.0', port=8080)