怎么用Python写个学生信息数据库系统,用于存放学生信息以及能够实现搜索查询本学生信息进行加分或减分然后传输到数据库打印出来,给个大致方向!!
回答引用自ChatGPT:
当编写一个学生信息数据库系统时,你可以遵循以下大致方向:
1、安装数据库驱动程序:首先,你需要安装适合你选择的数据库的Python驱动程序。常见的选择之一是SQLite数据库,你可以使用Python的内置模块sqlite3来操作它。
2、连接到数据库:使用驱动程序提供的方法,连接到数据库。你可以使用sqlite3.connect()方法创建一个连接对象,并指定数据库文件的路径。
3、创建学生信息表:使用SQL语句在数据库中创建一个学生信息表。表应包含适当的列,例如学生ID、姓名和分数。
4、插入学生信息:编写函数或方法,用于将学生信息插入到数据库表中。这可以通过使用execute()方法和SQL INSERT语句来完成。
5、查询学生信息:编写函数或方法,用于根据特定条件查询学生信息。可以使用SQL SELECT语句并结合适当的查询条件来实现。
6、更新学生信息:编写函数或方法,用于根据学生ID更新学生的分数。这可以通过使用SQL UPDATE语句和适当的条件来完成。
7、打印学生信息:编写函数或方法,用于从数据库中检索学生信息,并以适当的格式进行打印。
8、关闭数据库连接:最后,确保在程序结束时关闭数据库连接,以释放资源。
以下是一个基本的示例,展示了如何使用Python和SQLite来实现学生信息数据库系统的部分功能:
import sqlite3
# 连接到数据库
conn = sqlite3.connect('student.db')
# 创建学生信息表
conn.execute('''CREATE TABLE IF NOT EXISTS students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
score INTEGER NOT NULL
);''')
def insert_student(name, score):
# 插入学生信息到数据库
conn.execute("INSERT INTO students (name, score) VALUES (?, ?);", (name, score))
conn.commit()
def query_student(name):
# 查询学生信息
cursor = conn.execute("SELECT * FROM students WHERE name = ?;", (name,))
for row in cursor:
print("ID: {}, Name: {}, Score: {}".format(row[0], row[1], row[2]))
def update_score(id, new_score):
# 更新学生分数
conn.execute("UPDATE students SET score = ? WHERE id = ?;", (new_score, id))
conn.commit()
def print_students():
# 打印学生信息
cursor = conn.execute("SELECT * FROM students;")
for row in cursor:
print("ID: {}, Name: {}, Score: {}".format(row[0], row[1], row[2]))
# 示例用法
insert_student("Alice", 85)
insert_student("Bob", 92)
query_student("Alice")
# 输出: ID: 1, Name: Alice, Score: 85
update_score(2, 95)
print_students()
# 输出:
# ID: 1, Name: Alice, Score: 85
# ID: 2, Name: Bob, Score: 95
# 关闭数据库连接
conn.close()
不知道你这个问题是否已经解决, 如果还没有解决的话:使用pymysql、pymssql连接数据库查询的弊端是:每次都要连接数据库浪费资源,所有必须用数据库连接池。
参数 | 说明 |
---|---|
creater | 数据库接口 |
mincached | 启动时开启的空连接数量 |
maxcached | 连接池最大可用连接数量 |
maxshared | 连接池最大可共享连接数量 |
maxconnections | 最大允许连接数 |
blocking | 达到最大数量时是否阻塞 |
maxusage | 单个连接最大复用次数 |
setsession | 用于传递到数据库的准备会话 |
from DBUtils.PooledDB import PooledDB
import pymysql
config = {
'creator': pymysql,
'host': '10.133.0.46',
'port': 3306,
'user': 'rw_aps',
'password': 'rw_aps.aac',
'db': 'aac_lens_analysis',
'charset': 'utf8',
'maxconnections': 10, # 连接池最大连接数量
'cursorclass': pymysql.cursors.DictCursor #以字典的形式返回操作结果
}
pool = PooledDB(**config)
db = pool.connection()
cur = db.cursor()
sql = "select * from aac_lens_analysis.t_mysql_status where pair_date='2020-06-03' and pair_shift='day' "
cur.execute(sql)
result = cur.fetchall()
for i in result:
print(i)
cur.close()
db.close()
输出结果如下所示:
{'id': 48, 'pair_date': '2020-06-03', 'pair_shift': 'day', 'mysql_status': 'Success', 'site': '(2080, 2090, 5060)', 'created_time': datetime.datetime(2020, 6, 4, 2, 0)}
案例一: 从csv文件导入数据到MySQL数据库
csv文件内容如下:
首先创建数据库连接,在for循环中遍历get_data函数的结果。get_data函数打开csv文件,并将csv文件的每一行转换成一个命名元组。由于get_data使用yield语句返回结果,可以直接在for循环中遍历get_data函数的返回值。得到命名元组以后,拼接SQL语句,然后通过Cursor对象执行SQL语句
import pymysql
import csv
from collections import namedtuple
from contextlib import contextmanager
# 使用上下文管理器对数据库连接进行管理
@contextmanager
def get_conn(**kwargs):
conn = pymysql.connect(host=kwargs.get('host','localhost'),
user=kwargs.get('user'),
passwd=kwargs.get('password'),
port=kwargs.get('port',3306),
db=kwargs.get('db')
)
try:
yield conn
finally:
if conn:
conn.close()
#使用命名元组以后,允许使用列名代替下标访问元组中的内容
def get_data(file_name):
with open(file_name) as f:
f_csv = csv.reader(f)
#['id', 'name', 'sex', 'age', 'love']
headings = next(f_csv)
#命名元组
Row = namedtuple('Row',headings)
for r in f_csv:
#['1', '刘备', '男', '20', 'book']
yield Row(*r)
def execute_sql(conn,sql):
with conn as cur:
cur.execute(sql)
def main():
conn_args = dict(host="10.177.33.45", port=3306, user='root', password='root',
db='dw',connect_timeout=100)
with get_conn(**conn_args) as conn:
for i in get_data(r"D:\tmp\test_csv.csv"):
sql = f"insert into student values({i.id},'{i.name}','{i.sex}',{i.age},'{i.love}') "
print(sql)
execute_sql(conn,sql)
if __name__ == '__main__':
main()
数据库结果如下所示:
案例二:查询数据库数据往钉钉群推送
import requests
import json
import datetime
import pymysql
from collections import namedtuple
api_url = 'https://oapi.dingtalk.com/robot/send?access_token=98574912ab4cde67a19fbb875df93671088e6de87337bc1fedea10e1d2637461'
headers={'Content-Type':'application/json;charset=utf-8'}
retry = 26
# retry = 120
# 重试时间间隔:秒
retry_sec = 60
# retry_sec = 60
stop_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
start_time = datetime.datetime.now() + datetime.timedelta(hours=-1)
start_time = start_time.strftime("%Y-%m-%d %H:%M:%S")
# 往钉钉发送审计日志
def msg(text):
json_text={
"msgtype":"markdown",
"markdown":{
"title":"编组状态通知",
"text":text
}
}
print(requests.post(api_url,json.dumps(json_text),headers=headers).content)
# 获取数仓开始状态
def get_monitor_audit_data():
try:
db = pymysql.connect(host='10.133.0.19', port=30334, user='rw_etl', password='rw_etl.aac', db='lens_olap')
cursor = db.cursor()
sql = "select time as '命令执行时间',regexp_replace(user, 'default_cluster:', '') as 用户,cast(query_time / 1000 / 60 as int) as '查询时长(分钟)',cast(scan_bytes/1024/1024 as int) as '查询数据量(M)',scan_rows as 查询行数,return_rows as 返回行数,stmt as 查询语句 from doris_audit_db__.doris_audit_tbl__ where query_time > 300000 and time > date_sub(now(), INTERVAL 1 hour) order by time desc"
print("---ddddddddd---------")
print(sql)
cursor.execute(sql)
results = cursor.fetchall()
a=cursor.rowcount
print(a)
list=[]
if len(results) >= 1:
msg(f"{start_time}到{stop_time}时间范围内,palo数据库大的sql查询情况如下:")
headings = ['命令执行时间', '用户', '查询时长', '查询数据量', '查询行数', '返回行数', '查询语句']
Row = namedtuple('Row', headings)
for i in results:
a=[*i]
row_data=Row(*a)
text = f"""
用户:{row_data.用户}
命令执行时间:{row_data.命令执行时间}
查询时长(分钟):{row_data.查询时长}
查询数据量(M):{row_data.查询数据量}
查询行数:{row_data.查询行数}
返回行数:{row_data.返回行数}
查询语句:{row_data.查询语句}
"""
msg(text)
cursor.close()
db.close()
else:
print(f"{start_time}到{stop_time}时间范围内,palo数据库无大的sql查询")
except Exception as e:
print(e)
msg(f"{start_time}到{stop_time},连接palo数据库异常")
if __name__ == '__main__':
get_monitor_audit_data()
为了实现学生信息分数管理系统,你可以按照以下基本步骤进行操作:
设计数据库表结构:根据需求,设计学生信息和分数数据的数据库表结构。你可以参考段落5中的参考资料来进行设计。
选择合适的数据库:根据你的需求,选择一个适合的数据库来存储学生信息和分数数据。常见的选择有MySQL、SQLite、PostgreSQL等。你可以通过使用Python的数据库模块(如mysql.connector)来与数据库进行交互,具体的连接代码可以参考段落6中的参考资料。
编写代码实现功能:根据你的需求,编写Python代码来实现搜索、查询、加分和减分功能。下面是一个大致的实现方向:
a. 创建学生信息表和分数表:根据你的数据库设计,使用数据库管理工具(如MySQL Workbench)创建学生信息表和分数表,并向表中插入一些示例数据。
b. 实现查询功能:编写代码来查询学生信息和分数数据。你可以使用SELECT语句来查询目标数据,并将结果返回或打印出来。
c. 实现加分和减分功能:编写代码来修改学生的分数数据。你可以使用UPDATE语句来更新目标数据。
d. 实现搜索功能:编写代码来根据关键词搜索学生信息和分数数据。你可以使用LIKE语句来模糊匹配目标数据,并将结果返回或打印出来。
将结果传输到数据库并打印出来:在代码中使用数据库模块的功能,将查询结果或修改后的数据传输到数据库中,并打印出来。具体的代码实现可以参考段落0中的参考资料。
测试和优化:在完成代码编写后,对整个系统进行测试,确保功能的正确性和稳定性。如果有性能问题,可以对代码进行优化,如使用索引来加速查询操作。
总之,通过以上步骤,你可以基于Python编写一个学生信息分数管理系统。请注意,以上仅为一个大致的实现方向,具体实现需要根据你的具体需求进行调整和完善。如果遇到具体问题,可以通过在线编程论坛、查询相关文档或请教其他专业人士来获取帮助。