SQLAlchemy 提供了 ORM 功能,可以将 Python 对象映射到关系数据库中的表,从而简化了数据访问。它允许开发人员使用 Python 对关系数据库进行 SQL 操作,而不必直接编写 SQL 查询语句。
SQLAlchemy 支持多种数据库,包括 MySQL、PostgreSQL、SQLite、Oracle、MSSQL 等。
自己主要在 Flask中使用,所以安装的是 flask_sqlalchemy 库,安装:
1
| pip install flask_sqlalchemy
|
1.初始化(创建表)
创建 User 类对应的表 users。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| from flask_sqlalchemy import SQLAlchemy
current_dir = os.getcwd() db_file = os.path.join(current_dir, 'static', 'db', 'data.db')
app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{db_file}'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class User(db.Model) : __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64)) password = db.Column(db.String(128)) phone = db.Column(db.String(11), unique=True)
def db_init(): with app.app_context(): db.drop_all() db.create_all()
db_init()
|
2.增(插入数据)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| def insert_test_data(): new_user = User(name='张三',password='123',phone='12345674567') db.session.add(new_user) db.session.commit()
users = [ User(name='张三', password='123', phone='12345678901'), User(name='李四', password='456', phone='12345678902'), ] db.session.add_all(users) db.session.commit()
|
3.删(删除数据)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| def delete_user(phone): user = User.query.filter_by(phone=phone).first() if user: db.session.delete(user) db.session.commit()
del_phones = ['12345678801', '12345678802', '12345678803'] User.query.filter(User.phone.in_(del_phones)).delete(synchronize_session=False) db.session.commit()
|
4.改(修改数据)
1 2 3 4 5 6 7 8
| def change_password(phone, new_password): user = User.query.filter_by(phone=phone).first() if user: user.password = new_password db.session.commit()
|
5.查(查询数据)
filter_by 和 filter 都是 SQLAlchemy 中用于过滤查询结果的方法,但是它们的使用方式和功能有一些不同。
- filter_by: 是一个简化的过滤方法,它接受关键字参数,每个关键字参数表示一个等于条件。
- filter: 是一个更通用的过滤方法,它接受任何条件表达式。也就是说用的范围更广。
1 2 3 4 5 6 7 8
|
user = User.query.filter_by(phone=phone).first()
user = User.query.filter_by(phone=phone, password=password).first()
users = User.query.filter_by(name=name).all()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from sqlalchemy import and_
user = User.query.filter(User.name=='张三').first()
user = User.query.filter(and_(User.phone==phone, User.password==password)).first()
users = User.query.filter(User.name == name).all()
users = User.query.filter(User.name.like('张%')).all()
phones = ['12345678801', '12345678802', '12345678803'] users = User.query.filter(User.phone.in_(phones)).all()
|
PS.用 User.query.filter_by 和用 db.session.query(User).filter_by 功能上是一样的。