python使用orm操作数据库,最全解释看这一篇就够了!

文章 , 技术分享
393 0

总体代码如下,后面单独解释每个含义

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import MigrateCommand
from flask_migrate import Migrate
from flask_script import Manager,Server
 
#实例化一个Flask 对象
app = Flask(__name__)
 
#设置连接数据库的配置,这是以mysql db 为示例来讲解
app.config['SQLALCHEMY_DATABASE_URI']="mysql://root:[email protected]:3306/dbtest1"
 
#如果设置为True,将跟踪对象的修改并发出信号,默认设置为None
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
 
#查询时会显示原始SQL语句
app.config['SQLALCHEMY_ECHO']=True
 
#这个对象就包含 sqlalchemy 和 sqlalchemy.orm 中的所有函数和助手
db = SQLAlchemy(app)
 
 
manager = Manager(app)
Migrate(app,db)
#创建数据库映射命令
manager.add_command('db',MigrateCommand)
 
#创建启动命令
manager.add_command('start',Server(port=8000,use_debugger=True))
 
 
 
class Role(db.Model):#提供一个名为 Model 的类,用于作为声明模型时的 delarative 基类
    __tablename__ = 'roles' #给表起名
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64),unique=True)
    us = db.relationship("User",backref="role")
    icon = db.Column(db.String(40),default='default.jpg')
    def __repr__(self):#用于显示一个可读字符串
        return "Role:%s" %self.name
 
class User(db.Model):
    __tablename__ = 'users' #给表起名
    id=db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64),unique=True,index=True)
    email = db.Column(db.String(64),unique=True)
    pswd = db.Column(db.String(64))
    role_id=db.Column(db.Integer,db.ForeignKey('roles.id'))
 
    def __repr__(self):
        return "User:%s"% self.name
 
 
if __name__ == '__main__':
    # db.drop_all() # db 对象调用 SQLAlchemy.drop_all() 方法来删除表:
    # db.create_all() # db 对象调用 SQLAlchemy.create_all() 方法来创建表:
    # manager.run()
 
    #创建
    role1=Role(name="admin")
    role2=Role(name="test")
    db.session.add(role1)
    db.session.commit()
    db.session.add(role2)
    db.session.commit() #必须提交会话,但是没有必要在每个请求后删除它(session),Flask-SQLAlchemy 会帮您完成删除操作
 
    user1=User(name="wang",email="[email protected]",pswd="1234",role_id=role1.id)
    user2=User(name="test",email="[email protected]",pswd="1234",role_id=role2.id)
    db.session.add_all([user1,user2])
    db.session.commit()
 
    #查询
    user1=User.query.filter_by(name="wang")
    roles=Role.query.all()
    for role in roles:
        print(role.name,role.id)
 
    #删除
    user=User.query.first()
    db.session.delete(user)
    db.session.commit()
    print(User.query.all())
    print("*")
    print(user)
 
    #更新
    user=User.query.first()
    user.name="test"
    db.session.commit()
    print(User.query.first())


连接数据库需要先配置数据库连接字符串,然后在 Flask 中设置数据库相关的参数。常见的关系型数据库包括 SQLite、MySQL、PostgreSQL 等。

以下是使用 SQLite 数据库的示例:

  1. 安装 SQLAlchemy 库和适用于 SQLite 的数据库驱动程序(可选),例如 sqlite3:
pip install sqlalchemy
pip install sqlite3
  1. 在 Flask 应用程序中设置数据库连接字符串:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

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

这个示例中我们配置了 SQLite 数据库的连接字符串,其中 example.db 是数据库文件的名字。也可以使用其他形式的连接字符串,例如 MySQL 和 PostgreSQL 的连接字符串。

  1. 创建数据模型类,并在类中定义要创建的表格及其列名:
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

这个示例中我们定义了一个名为 User 的数据模型类,它对应了数据库中的一张 User 表。该表包含三个字段:id、name 和 email。

  1. 执行迁移操作以创建数据库表:
db.create_all()

这个命令将根据定义的数据模型类创建相应的数据库表。如果已经存在同名数据库表,则不会进行任何操作。

至此,你已经成功地连接了 SQLite 数据库,并且创建了一个名为 User 的数据模型类以及相应的表格。在实践过程中,还需要注意数据库的安全性、性能等问题,具体请参考官方文档。

如果您想使用 PyMySQL 库来连接 MySQL 数据库,可以按照以下步骤进行设置:

  1. 安装 PyMySQL 库:
pip install pymysql
  1. 在 Flask 应用程序中设置数据库连接字符串和相关参数:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@hostname/database_name'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

其中,SQLALCHEMY_DATABASE_URI 是数据库连接字符串,usernamepassword 是登录 MySQL 时的用户名和密码,hostname 是 MySQL 服务器的主机名或 IP 地址,database_name 是要连接的数据库名。SQLALCHEMY_TRACK_MODIFICATIONS 设置为 False,这样 SQLAlchemy 就不会在每次请求结束后自动提交对数据库的更改。

  1. 创建数据模型类,并在类中定义要创建的表格及其列名:
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

这个示例中我们定义了一个名为 User 的数据模型类,它对应了数据库中的一张 User 表。该表包含三个字段:id、name 和 email。

  1. 执行迁移操作以创建数据库表:
db.create_all()

这个命令将根据定义的数据模型类创建相应的数据库表。如果已经存在同名数据库表,则不会进行任何操作。

至此,你已经成功地连接了 MySQL 数据库,并且创建了一个名为 User 的数据模型类以及相应的表格。在实践过程中,还需要注意数据库的安全性、性能等问题,具体请参考官方文档。

使用 SQLAlchemy 创建数据库时,可以通过在定义数据模型类时添加一些属性来指定数据库表中的字段类型、约束和其他属性。

下面是一些常用的 SQLAlchemy 字段属性:

  • db.String(length, **kwargs): 表示一个字符串类型的字段,length 参数表示字符串的最大长度。
  • db.Integer(**kwargs): 表示一个整数类型的字段。
  • db.Float(**kwargs): 表示一个浮点数类型的字段。
  • db.Boolean(**kwargs): 表示一个布尔类型的字段。
  • db.Date(**kwargs): 表示一个日期类型的字段。
  • db.Time(**kwargs): 表示一个时间类型的字段。
  • db.DateTime(**kwargs): 表示一个日期时间类型的字段。
  • db.Text(**kwargs): 表示一个文本类型的字段,可以存储更长的文本。
  • db.Unicode(length, **kwargs): 表示一个 Unicode 字符串类型的字段,length 参数表示字符串的最大长度。

除了字段类型之外,还可以设置一些其他属性来指定约束和默认值等信息:

  • primary_key=True: 将字段设为主键。
  • unique=True: 给字段添加唯一约束。
  • nullable=False: 禁止字段为空值。
  • default=value: 定义字段的默认值为 value。
  • index=True: 为字段创建索引。

例如,下面是一个使用 SQLAlchemy 创建 User 表的例子:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

这个例子中,我们定义了一个名为 User 的数据模型类,并在其中定义了三个字段:id、name 和 email。其中,id 字段是主键,name 和 email 字段都不能为空。另外,我们还定义了一个名为 created_at 的字段,它的类型是 DateTime,并设置默认值为当前时间。

除上述属性之外,SQLAlchemy 还提供了很多其他的选项和参数,可以根据实际需求进行设置。详细的内容可以查看 SQLAlchemy 的官方文档。

在使用 SQLAlchemy 操作数据库时,需要了解常用的增删改查操作。下面是一些常用的操作示例:

  1. 查询数据

查询数据通常使用 query 方法,例如从 User 表中查询所有数据可以这样写:

users = User.query.all()

也可以根据条件过滤数据,例如查询名字为 Alice 的用户:

user = User.query.filter_by(name='Alice').first()

还可以使用 filter 方法组合多个条件,例如查询名字为 Alice 并且邮箱以 example.com 结尾的用户:

users = User.query.filter(User.name == 'Alice', User.email.endswith('example.com')).all()
  1. 插入数据

插入数据可通过创建一个新的数据模型对象并将其添加到会话中来实现:

user = User(name='Bob', email='[email protected]')
db.session.add(user)
db.session.commit()
  1. 更新数据

更新数据可以先查询要更新的记录,然后对其属性进行修改,并将其提交到数据库中:

user = User.query.filter_by(name='Alice').first()
user.email = '[email protected]'
db.session.commit()
  1. 删除数据

删除数据通常先查询要删除的记录,然后调用 delete 方法将其删除:

user = User.query.filter_by(name='Bob').first()
db.session.delete(user)
db.session.commit()

除了上述基本操作之外,SQLAlchemy 还提供了很多其他的高级操作,例如聚合函数、联结查询、事务处理等功能。具体使用方法可以参考官方文档。

最后更新 2023-07-15
评论 ( 0 )
OωO
隐私评论