Flask-SQLAlchemy:在Flask应用中优雅地操作数据库
在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架,它以简洁、灵活而著称。而当我们需要在Flask应用中与数据库进行交互时,Flask-SQLAlchemy就成为了一个强大而便捷的工具。它将Flask的简洁性与SQLAlchemy的强大数据库抽象能力完美结合,让我们能够轻松地在Flask应用中进行数据库操作,无论是简单的查询还是复杂的数据库事务管理,都能得心应手。
引言
在现代Web应用开发中,数据库是存储和管理数据的核心组件。我们需要一种高效、可靠且易于使用的方式来与数据库进行交互,以便实现数据的存储、检索、更新和删除等操作。Flask-SQLAlchemy为我们提供了这样的解决方案,它简化了数据库操作的流程,同时还提供了一系列强大的功能,如数据库迁移、模型关系定义等,大大提高了开发效率。
Flask-SQLAlchemy的基础概念
SQLAlchemy简介
SQLAlchemy是一个强大的Python SQL工具包,它提供了一套完整的企业级持久化模式,用于将数据库操作抽象为Python代码。它允许我们使用面向对象的方式来操作数据库,而不必编写繁琐的SQL语句。SQLAlchemy支持多种数据库,包括MySQL、PostgreSQL、SQLite等,这使得我们在切换数据库时只需修改少量配置,而无需更改大量的代码。
Flask与SQLAlchemy的结合:Flask-SQLAlchemy
Flask-SQLAlchemy是一个为Flask应用专门设计的扩展,它将SQLAlchemy集成到Flask框架中,使得在Flask应用中使用SQLAlchemy变得更加简单和便捷。它提供了一些Flask特定的功能和约定,例如与Flask的配置系统集成,自动处理数据库连接和会话管理等,让我们能够更加专注于业务逻辑的开发,而不必过多关注数据库连接的细节。
安装与配置
- 安装
要使用Flask-SQLAlchemy,首先需要在Python环境中安装它。可以使用pip命令进行安装:
pip install flask-sqlalchemy
- 配置
在Flask应用中,需要进行一些配置来告诉Flask-SQLAlchemy如何连接到数据库。通常在Flask应用的配置文件中进行设置,例如:
from flask import Flaskapp = Flask(__name__)# 配置数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///your_database.db' # 使用SQLite数据库为例
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭不必要的跟踪# 其他Flask配置...if __name__ == '__main__':app.run()
这里的SQLALCHEMY_DATABASE_URI
指定了数据库的连接字符串,不同的数据库类型有不同的连接字符串格式。例如,对于MySQL数据库,可能是mysql://username:password@host:port/database_name
。SQLALCHEMY_TRACK_MODIFICATIONS
设置为False是为了避免一些不必要的警告,在生产环境中通常建议这样设置。
使用Flask-SQLAlchemy进行数据库建模
定义模型类
在Flask-SQLAlchemy中,我们使用Python类来定义数据库表的结构,这些类被称为模型类。每个模型类对应着数据库中的一个表,类中的属性则对应着表中的列。例如,我们要创建一个用户表和一个文章表,可以定义如下的模型类:
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()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)class Article(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(200), nullable=False)content = db.Column(db.Text, nullable=False)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)author = db.relationship('User', backref='articles')
在上述代码中,User
和Article
是两个模型类,分别对应着用户表和文章表。db.Column
用于定义表中的列,其中参数如db.Integer
、db.String
等指定了列的数据类型,primary_key=True
表示该列是主键,unique=True
表示该列的值必须唯一,nullable=False
表示该列不能为空。Article
模型中的user_id
列是外键,通过db.ForeignKey
关联到User
模型的id
列,表示一篇文章属于一个用户。author
属性是一个关系属性,通过db.relationship
定义,它使得我们可以从文章对象方便地获取到对应的用户对象,反之亦然。
模型之间的关系
Flask-SQLAlchemy支持多种模型之间的关系定义,除了上面示例中的一对多关系(一个用户可以有多篇文章),还包括多对多关系等。例如,如果我们要实现一个用户可以关注多个其他用户,并且一个用户也可以被多个用户关注的功能,可以这样定义模型:
class User(db.Model):#... 其他属性和方法following = db.relationship('User', secondary='followers',primaryjoin='User.id == Followers.follower_id',secondaryjoin='User.id == Followers.followed_id',backref=db.backref('followers', lazy='dynamic'))class Followers(db.Model):follower_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)followed_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
这里通过secondary
参数指定了一个中间表Followers
来实现多对多关系。primaryjoin
和secondaryjoin
参数用于定义连接条件,backref
参数则为反向关系提供了一个方便的访问方式。
数据库操作
创建数据库表
在定义好模型类后,我们需要创建数据库表。Flask-SQLAlchemy提供了一个方便的方法来创建表,只需在Flask应用的上下文环境中调用db.create_all()
即可。例如:
from flask import Flask
from your_app import db, User, Article # 假设你的模型类在your_app模块中定义app = Flask(__name__)
# 配置数据库连接等...@app.before_first_request
def create_tables():with app.app_context():db.create_all()if __name__ == '__main__':app.run()
@app.before_first_request
装饰器确保在应用首次收到请求之前创建数据库表。这样,当我们启动应用时,数据库表会自动根据模型类的定义进行创建。如果数据库表已经存在,再次调用db.create_all()
不会产生任何影响,它是安全的。
插入数据
要向数据库表中插入数据,我们可以创建模型类的实例,并将其添加到数据库会话中,然后提交会话。例如:
from flask import Flask
from your_app import db, Userapp = Flask(__name__)
# 配置数据库连接等...@app.route('/add_user')
def add_user():new_user = User(username='john_doe', email='john@example.com')db.session.add(new_user)db.session.commit()return 'User added successfully!'if __name__ == '__main__':app.run()
在上述代码中,我们创建了一个User
模型类的实例new_user
,并设置了其username
和email
属性的值。然后通过db.session.add()
将其添加到数据库会话中,最后调用db.session.commit()
提交会话,将数据真正插入到数据库表中。
查询数据
Flask-SQLAlchemy提供了丰富的查询方法来检索数据库中的数据。我们可以使用query
对象来执行各种查询操作。例如:
@app.route('/get_users')
def get_users():users = User.query.all()for user in users:print(user.username, user.email)return 'Users retrieved successfully!'
User.query.all()
返回数据库中所有的用户记录,它是一个包含User
模型类实例的列表。我们可以遍历这个列表来获取每个用户的信息。还可以根据条件进行查询,例如:
@app.route('/get_user_by_username')
def get_user_by_username():username = 'john_doe'user = User.query.filter_by(username=username).first()if user:print(user.username, user.email)else:print('User not found.')return 'User query completed!'
User.query.filter_by(username=username)
根据username
字段进行筛选,first()
方法返回查询结果中的第一个匹配项。如果没有找到匹配的用户,first()
会返回None
。
更新数据
更新数据也很简单,首先获取要更新的记录,然后修改其属性值,最后提交会话。例如:
@app.route('/update_user_email')
def update_user_email():username = 'john_doe'user = User.query.filter_by(username=username).first()if user:user.email = 'new_email@example.com'db.session.commit()return 'User email updated successfully!'else:return 'User not found.'
这里我们先根据username
找到用户记录,然后将其email
属性修改为新的值,最后提交会话以保存更新。
删除数据
删除数据同样需要先获取要删除的记录,然后调用db.session.delete()
方法将其从数据库中删除,并提交会话。例如:
@app.route('/delete_user')
def delete_user():username = 'john_doe'user = User.query.filter_by(username=username).first()if user:db.session.delete(user)db.session.commit()return 'User deleted successfully!'else:return 'User not found.'
数据库事务处理
在实际应用中,我们经常需要执行一系列的数据库操作,这些操作要么全部成功,要么全部失败,这就需要使用数据库事务。Flask-SQLAlchemy提供了方便的事务处理机制。例如:
@app.route('/transfer_money')
def transfer_money():from_user = User.query.filter_by(username='user1').first()to_user = User.query.filter_by(username='user2').first()amount = 100 # 假设转账金额为100with db.session.begin_nested():# 从from_user账户中扣除金额from_user.balance -= amount# 向to_user账户中增加金额to_user.balance += amounttry:# 提交事务db.session.commit()return 'Money transfer successful!'except:# 如果发生错误,回滚事务db.session.rollback()return 'Money transfer failed!'
在上述代码中,我们模拟了一个简单的转账操作,从一个用户账户中扣除一定金额并添加到另一个用户账户中。通过with db.session.begin_nested():
开启一个嵌套事务,在事务块中进行数据库操作。如果在操作过程中发生错误,我们可以捕获异常并调用db.session.rollback()
回滚事务,以保证数据的一致性。
数据库迁移
随着应用的发展,数据库结构可能会发生变化,例如添加新的表、修改列的数据类型等。手动处理这些数据库结构的变更可能会非常繁琐且容易出错。Flask-SQLAlchemy通常与数据库迁移工具如Alembic结合使用,来方便地管理数据库结构的变更。
- 安装Alembic
pip install alembic
- 初始化Alembic
在Flask应用的根目录下,运行以下命令来初始化Alembic:
alembic init alembic
这将创建一个alembic
目录和一些配置文件。
- 修改配置文件
打开alembic.ini
文件,修改其中的sqlalchemy.url
配置项,使其指向你的Flask应用的数据库连接字符串。例如:
sqlalchemy.url = sqlite:///your_database.db
然后在alembic/env.py
文件中,将target_metadata
设置为你的Flask应用中的db.Model.metadata
。例如:
from your_app import db
from sqlalchemy import MetaDatatarget_metadata = db.Model.metadata
- 创建迁移脚本
当你对数据库模型进行了修改后,例如添加了一个新的列,你可以运行以下命令来创建迁移脚本:
alembic revision -m "Add new column to user table"
这将生成一个新的迁移脚本文件,你可以在其中看到对数据库结构变更的描述。
- 升级数据库
要应用迁移脚本并更新数据库结构,运行以下命令:
alembic upgrade head
这将执行迁移脚本中的变更操作,更新数据库结构。
通过使用Alembic进行数据库迁移,我们可以轻松地管理数据库结构的版本,并且可以方便地回滚到之前的版本,如果需要的话。
性能优化与注意事项
查询优化
- 合理使用索引
在数据库表的列上创建合适的索引可以大大提高查询性能。例如,如果经常根据用户的username
进行查询,可以在username
列上创建索引。在Flask-SQLAlchemy中,可以通过在模型类的列定义中添加index=True
来创建索引,例如:
class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False, index=True)email = db.Column(db.String(120), unique=True, nullable=False)
- 避免不必要的查询
在获取数据时,只查询需要的字段,避免查询不必要的大量数据。例如,如果只需要获取用户的username
和email
,可以使用query.with_entities()
方法指定要查询的字段,如下所示:
users = User.query.with_entities(User.username, User.email).all()
- 分页查询
当查询大量数据时,一次性获取所有数据可能会导致性能问题。可以使用分页查询来分批获取数据。Flask-SQLAlchemy提供了paginate()
方法来实现分页查询,例如:
@app.route('/get_users_paginated')
def get_users_paginated():page = int(request.args.get('page', 1)) # 获取当前页码,默认为1per_page = 10 # 每页显示的记录数users = User.query.paginate(page=page, per_page=per_page)return render_template('users.html', users=users)
在模板中,可以使用users.items
来获取当前页的数据,users.has_prev
和users.has_next
来判断是否有上一页和下一页,users.prev_num
和users.next_num
来获取上一页和下一页的页码。
连接池管理
Flask-SQLAlchemy默认使用数据库连接池来管理数据库连接。连接池可以复用连接,减少连接创建和销毁的开销,提高性能。但是,如果连接池配置不当,也可能会导致性能问题。可以根据应用的实际情况调整连接池的大小等参数。一般来说,可以通过在Flask应用的配置中设置SQLALCHEMY_POOL_SIZE
来指定连接池的大小,例如:
app.config['SQLALCHEMY_POOL_SIZE'] = 20 # 设置连接池大小为20
注意事项
- 数据一致性
在进行数据库操作时,要特别注意数据的一致性。例如,在处理多对多关系时,要确保中间表的数据正确更新,避免出现数据不一致的情况。 - 错误处理
要对数据库操作中的错误进行妥善处理,及时捕获异常并进行相应的处理,如回滚事务、返回错误信息给用户等。避免因为错误处理不当导致数据错误或应用崩溃。 - 安全问题
在使用Flask-SQLAlchemy时,要注意防止SQL注入等安全问题。不要直接将用户输入的数据拼接到SQL语句中,应该使用参数化查询或ORM提供的安全查询方法。例如,在查询用户时,应该使用filter_by
等方法而不是手动拼接SQL语句。
总结
Flask-SQLAlchemy为我们在Flask应用中与数据库进行交互提供了一种简洁、高效且强大的方式。通过它,我们可以轻松地进行数据库建模、数据操作、事务处理以及数据库迁移等工作。在实际开发中,我们要充分利用它的功能,同时注意性能优化和安全问题,以构建出稳定、高效的Web应用。随着对Flask-SQLAlchemy的深入了解和熟练运用,我们能够更加得心应手地处理数据库相关的任务,为应用的开发和维护提供有力支持。无论是开发小型的个人项目还是大型的企业级应用,Flask-SQLAlchemy都能成为我们的得力助手,帮助我们在数据库操作的世界中畅游无阻,实现更加丰富和复杂的业务逻辑。希望通过这篇文章,你能对Flask-SQLAlchemy有一个全面的认识和了解,并在实际项目中运用它来提升开发效率和应用质量。
相关文章:
Flask-SQLAlchemy:在Flask应用中优雅地操作数据库
在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架,它以简洁、灵活而著称。而当我们需要在Flask应用中与数据库进行交互时,Flask-SQLAlchemy就成为了一个强大而便捷的工具。它将Flask的简洁性与SQLAlchemy的强大数据库抽象能力完美结…...
智能巡检机器人 数据库
智能巡检机器人AI智能识别。无需人工。只需后台监控结果即可!...
Spring AOP异步操作实现
在Spring框架中,AOP(面向切面编程)提供了一种非常灵活的方式来增强应用程序的功能。异步操作是现代应用程序中常见的需求,尤其是在处理耗时任务时,它可以帮助我们提高应用程序的响应性和吞吐量。Spring提供了一种简单的…...
【2006.07】UMLS工具——MetaMap原理深度解析
文献:《MetaMap: Mapping Text to the UMLS Metathesaurus》2006 年 7 月 14 日 https://lhncbc.nlm.nih.gov/ii/information/Papers/metamap06.pdf MetaMap:将文本映射到 UMLS 元数据库 总结 解决的问题 自动概念映射问题:解决如何将文本…...
ros2 colcon build 构建后,install中的local_setup.bash 和setup.bash有什么区别
功能概述 在 ROS2 中,colcon build是用于构建软件包的工具。构建完成后会生成install文件夹,其中的setup.bash和local_setup.bash文件都与环境设置相关,但存在一些区别。setup.bash 作用范围 setup.bash文件用于设置整个工作空间的环境变量。…...
Thymeleaf基础语法
Thymeleaf 是一种用于 Web 和非 Web 环境的现代服务器端 Java 模板引擎。它能够处理 HTML、XML、JavaScript、CSS 甚至纯文本。以下是 Thymeleaf 的一些基础语法: 1. 变量表达式 <!-- 显示变量的值 --> <p th:text"${name}">Default Name&l…...
spring cloud alibaba学习路线
以下是一条学习Spring Cloud Alibaba的路线: 一、基础前置知识 1. Java基础 熟练掌握Java语言特性,包括面向对象编程、集合框架、多线程等知识。 2. Spring和Spring Boot基础深入理解Spring框架,如依赖注入(DI)、控…...
基于 Seq2Seq 的中英文翻译项目(pytorch)
项目简介 本项目旨在使用 PyTorch 构建一个基于 Seq2Seq(编码器-解码器架构)的中英文翻译模型。我们将使用双语句子对的数据进行训练,最终实现一个能够将英文句子翻译为中文的模型。项目的主要步骤包括: 数据预处理:从数据集中提取英文和中文句子,并进行初步清洗和保存。…...
部标主动安全(ADAS+DMS)对接说明
1.前言 上一篇介绍了部标(JT/T1078)流媒体对接说明,这里说一下如何对接主动安全附件服务器。 流媒体的对接主要牵扯到4个方面: (1)平台端:业务端系统,包含前端呈现界面。 &#x…...
C++ STL(1)迭代器
文章目录 一、迭代器详解1、迭代器的定义与功能2、迭代器类型3、示例4、迭代器失效4.1、vector 迭代器失效分析4.2、list 迭代器失效分析4.3、set 与 map 迭代器失效分析 5、总结 前言: 在C标准模板库(STL)中,迭代器是一个核心概念…...
uview表单校验不生效问题
最近几次使用发现有时候会不生效,具体还没排查出来什么原因,先记录一下解决使用方法 <u--formlabelPosition"top"labelWidth"auto":model"form":rules"rules"ref"uForm" ><view class"…...
前端开发设计模式——单例模式
目录 一、单例模式的定义和特点: 1.定义: 2.特点: 二、单例模式的实现方式: 1.立即执行函数结合闭包实现: 2.ES6类实现: 三、单例模式的应用场景 1.全局状态管理: 2.日志记录器: …...
行情叠加量化,占据市场先机!
A股久违的3000点,最近都没有更新,现在终于对我们的市场又来点信息。相信在座的朋友这几天都是喜笑颜开,对A股又充满信心。当前行情好起来了,很多朋友又开始重回市场,研究股票学习量化,今天我们给大家重温下…...
大厂面试真题-ConcurrentHashMap怎么保证的线程安全?
ConcurrentHashMap是Java中的一个线程安全的哈希表实现,它通过一系列精妙的机制来保证线程安全。以下是ConcurrentHashMap保证线程安全的主要方式: 分段锁(Segment Locking,Java 1.8之前): 在Java 1.8之前的…...
【RabbitMQ】消息堆积、推拉模式
消息堆积 原因 消息堆积是指在消息队列中,待处理的消息数量超过了消费者处理能力,导致消息在队列中不断堆积的现象。通常有以下几种原因: 消息生产过快:在高流量或者高负载的情况下,生产者以极高的速率发送消息&…...
MySQL常用SQL语句(持续更新中)
文章目录 数据库相关表相关索引相关添加索引 编码相关系统变量相关 收录一些经常用到的sql 数据库相关 建数据库 CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校对规则名>];例如: C…...
【更新】红色文化之红色博物馆数据集(经纬度+地址)
数据简介:红色博物馆作为国家红色文化传承与爱国主义教育的重要基地,遍布全国各地,承载着丰富的革命历史与文化记忆。本数据说明旨在汇总并分析全国范围内具有代表性的红色博物馆的基本信息,包括其地址、特色及教育意义࿰…...
Python项目Flask框架整合Redis
一、在配置文件中创建Redis连接信息 二、 实现Redis配置类 import redis from config.config import REDIS_HOST, REDIS_PORT, REDIS_PASSWD, REDIS_DB, EXPIRE_TIMEclass RedisDb():def __init__(self, REDIS_HOST, REDIS_PORT, REDIS_DB, EXPIRE_TIME, REDIS_PASSWD):# 建立…...
完整网络模型训练(一)
文章目录 一、网络模型的搭建二、网络模型正确性检验三、创建网络函数 一、网络模型的搭建 以CIFAR10数据集作为训练例子 准备数据集: #因为CIFAR10是属于PRL的数据集,所以需要转化成tensor数据集 train_data torchvision.datasets.CIFAR10(root&quo…...
高效便捷,体验不一样的韩语翻译神器
嘿,大家好啊!今天想跟大家聊聊我用过的几款翻译神器,特别是它们在翻译韩语时的那些小感受。作为一个偶尔需要啃啃韩语资料或者跟韩国朋友聊天的普通人,我真心觉得这些翻译工具简直就是我的救星! 一、福昕在线翻译 网址…...
Markdown笔记管理工具Haptic
什么是 Haptic ? Haptic 是一个新的本地优先、注重隐私的开源 Markdown 笔记管理工具。它简约、轻量、高效,旨在提供您所需的一切,而不包含多余的功能。 目前官方提供了 docker 和 Mac 客户端。 Haptic 仍在积极开发中。以下是未来计划的一些…...
网络原理-传输层UDP
上集回顾: 上一篇博客中讲述了应用层如何自定义协议:确定传输信息,确定数据格式 应用层也有一些现成的协议:HTTP协议 这一篇博客中来讲述传输层协议 传输层 socket api都是传输层协议提供的(操作系统内核实现的了…...
C++中,如何使你设计的迭代器被标准算法库所支持。
iterator(读写迭代器) const_iterator(只读迭代器) reverse_iterator(反向读写迭代器) const_reverse_iterator(反向只读迭代器) 以经常介绍的_DList类为例,它的迭代…...
Java NIO 全面详解:掌握 `Path` 和 `Files` 的一切
在 Java 7 中引入的 NIO (New I/O) 为文件系统和流的操作带来了强大的能力,其中 Path 和 Files 是核心部分。Path 作为对文件路径的抽象,提供了灵活的方式处理文件系统中的路径;Files 则通过一系列静态方法,使得文件的读写、复制、…...
bluez免提协议hands-free介绍,全到无法想象,bluez hfp ag介绍
零. 前言 由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统…...
关于区块链的安全和隐私
背景 区块链技术在近年来发展迅速,被认为是安全计算的突破,但其安全和隐私问题在不同应用中的部署仍处于争论焦点。 目的 对区块链的安全和隐私进行全面综述,帮助读者深入了解区块链的相关概念、属性、技术和系统。 结构 首先介绍区块链…...
特征工程——一门提高机器学习性能的艺术
当前围绕人工智能(AI)和机器学习(ML)展开的许多讨论以模型为中心,聚焦于 ML和深度学习(DL)的最新进展。这种模型优先的方法往往对用于训练这些模型的数据关注不足,甚至完全忽视。类似MLOps的领域正迅速发展,通过系统性地训练和利用ML模型&…...
Paper解读:工作场所人机协作的团队形成:促进组织变革的目标编程模型
人工智能(AI)具有降低运营成本、提高效率和改善客户体验的潜力。 因此,在组织中组建项目团队至关重要,这样他们就会在决策过程中欢迎人工智能。 当前的技术革命要求公司快速变革,并增加了对团队在促进创新采用方面的作…...
图文深入理解Oracle Network配置管理(一)
List item 本篇图文深入介绍Oracle Network配置管理。 Oracle Network概述 Oracle Net 服务 Oracle Net 监听程序 <oracle_home>/network/admin/listener.ora <oracle_home>/network/admin/sqlnet.ora建立网络连接 要建立客户机或中间层连接,Oracle…...
leetcode-链表篇3
leetcode-61 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1: 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3]示例 2: 输入:head [0,1,2], k 4 输出&#x…...
哈尔滨网站建设渠道/谷歌chrome浏览器
1、克隆远程仓库 git clone [仓库地址] ,但是这样只能克隆master分支的代码,如果我想克隆远程仓库中某一分支的代码怎么办呢?git clone -b [对应的远程分支名称] [仓库地址] 。如克隆aspnetcore的3.0分支:git clone -b 3.0 https:…...
金泉网做网站多少钱/制作网站的步骤是什么
一、xml布局,定义一个按钮(点击获取)和一个ImageView用来装图片xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_height"match_parent"android:paddingBottom"dimen/activity_…...
做算命类网站违法吗/劳动局免费培训项目
人工智能标记语言AIML聊天机器人:产生、种类、应用、实例、AIML概述、知识库、公司、业界(20k字经典收藏版)秦陇纪10译编 聊天机器人(chatterbot)是一个用来模拟人类对话或聊天的程序,试图建立程序让真人认…...
做网站的广告图片/百度广告投放平台叫什么
Example002 题目 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针,请写出相应的入队列和出队列的算法。 分析 注意,这里的不设头指针的意思是不设定队头指针。 我们设 rear 为带头结点的循环链…...
广州科 外贸网站建设/网销是做什么的
最近发现DOMDocument对象很重要,还有XMLHTTP也很重要 注意大小写一定不能弄错. 属性: 1Attributes 存储节点的属性列表(只读) 2childNodes 存储节点的子节点列表(只读) 3dataType 返回此节点的数据类型 4Definition 以DTD或XML模式给出的节点的定义(只读) …...
正规的网店平台有哪些/网站如何提升seo排名
torch.manual_seed(seed)设定生成随机数的种子,并返回一个torch._C.Generator对象,参数:seed(int or long):种子。torch.initial_seed()返回生成随机数的原始种子值(python long)。torch.get_rng_state() 返回随机生成…...