【在mysql中建立空白表】
【创建语句模板】
要构造上述列表的MySQL语句,你可以使用以下命令创建一个名为"tablename"的表:
CREATE TABLE tablename (
id INT,
projectid INT,
authorlastname VARCHAR(50),
pub_year YEAR,
title VARCHAR(200),
abstract TEXT,
journal VARCHAR(100),
impact FLOAT,
includecriteria VARCHAR(100)
);
【 更改表名】
alter table tablename
return to articles;
【显示创建的空白表格】
【测试是否与mysql数据库顺利连接】
pymysql 的代码还是很简单的, 以下代码分别为连接mysql 获得connection, 从connection 获得cursor 进行操作, 都是固定套路
pymysql_1.py
#! /usr/bin/python
# -*- coding: UTF-8 -*-
"""
测试
pymysql 的代码还是很简单的,
以下代码分别为连接mysql 获得connection, 从connection 获得cursor 进行操作,
都是固定套路:
"""
import mysql.connector
import pymysql
host = 'localhost'
port = 3306
db = 'sqltest'
user = 'root'
password = 'muren123'
# ---- 用pymysql 操作数据库
def get_connection():
conn = pymysql.connect(host=host, port=port, db=db, user=user, password=password)
return conn
def check_it():
conn = get_connection()
# 使用 cursor() 方法创建一个 dict 格式的游标对象 cursor
cursor = conn.cursor(pymysql.cursors.DictCursor)
# 使用 execute() 方法执行 SQL 查询
cursor.execute("select count(id) as total from articles")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
print("-- 当前数量: %d " % data['total'])
# 关闭数据库连接
cursor.close()
conn.close()
if __name__ == '__main__':
check_it()
结果:起初在mysql中建立了空白表,该代码运行成功后正确显示当前数量为0
使用with 优化操作代码
从以上代码可以看到, 如果每次都要打开连接, 关闭连接 .... 代码难看且容易出错. 最好的办法是用 python with 的方式来增加一个上下文管理器. 修改如下:
pymysql_2.py
#! /usr/bin/python
# -*- coding: UTF-8 -*-
"""
使用with 优化操作代码
从以上代码可以看到, 如果每次都要打开连接, 关闭连接 ....
代码难看且容易出错. 最好的办法是用 python with 的方式来增加一个上下文管理器
"""
import pymysql
from timeit import default_timer
host = 'localhost'
port = 3306
db = 'sqltest'
user = 'root'
password = 'muren123'
# ---- 用pymysql 操作数据库
def get_connection():
conn = pymysql.connect(host=host, port=port, db=db, user=user, password=password)
return conn
# ---- 使用 with 的方式来优化代码
class UsingMysql(object):
def __init__(self, commit=True, log_time=True, log_label='总用时'):
"""
:param commit: 是否在最后提交事务(设置为False的时候方便单元测试)
:param log_time: 是否打印程序运行总时间
:param log_label: 自定义log的文字
"""
self._log_time = log_time
self._commit = commit
self._log_label = log_label
def __enter__(self):
# 如果需要记录时间
if self._log_time is True:
self._start = default_timer()
# 在进入的时候自动获取连接和cursor
conn = get_connection()
cursor = conn.cursor(pymysql.cursors.DictCursor)
conn.autocommit = False
self._conn = conn
self._cursor = cursor
return self
def __exit__(self, *exc_info):
# 提交事务
if self._commit:
self._conn.commit()
# 在退出的时候自动关闭连接和cursor
self._cursor.close()
self._conn.close()
if self._log_time is True:
diff = default_timer() - self._start
print('-- %s: %.6f 秒' % (self._log_label, diff))
@property
def cursor(self):
return self._cursor
def check_it():
with UsingMysql(log_time=True) as um:
um.cursor.execute("select count(id) as total from articles")
data = um.cursor.fetchone()
print("-- 当前数量: %d " % data['total'])
if __name__ == '__main__':
check_it()
【封装公用代码】
现在新增一个类, 将连接代码和写好的UsingMysql 放进去,
pymysql_comm.py
#! /usr/bin/python
# -*- coding: UTF-8 -*-
"""
封装公用代码
现在新增一个pymysql_comm.py 类, 将连接代码和写好的UsingMysql 放进去,
"""
import pymysql
from timeit import default_timer
host = 'localhost'
port = 3306
db = 'sqltest'
user = 'root'
password = 'muren123'
# ---- 用pymysql 操作数据库
def get_connection():
conn = pymysql.connect(host=host, port=port, db=db, user=user, password=password)
return conn
# ---- 使用 with 的方式来优化代码
class UsingMysql(object):
def __init__(self, commit=True, log_time=True, log_label='总用时'):
"""
:param commit: 是否在最后提交事务(设置为False的时候方便单元测试)
:param log_time: 是否打印程序运行总时间
:param log_label: 自定义log的文字
"""
self._log_time = log_time
self._commit = commit
self._log_label = log_label
def __enter__(self):
# 如果需要记录时间
if self._log_time is True:
self._start = default_timer()
# 在进入的时候自动获取连接和cursor
conn = get_connection()
cursor = conn.cursor(pymysql.cursors.DictCursor)
conn.autocommit = False
self._conn = conn
self._cursor = cursor
return self
def __exit__(self, *exc_info):
# 提交事务
if self._commit:
self._conn.commit()
# 在退出的时候自动关闭连接和cursor
self._cursor.close()
self._conn.close()
if self._log_time is True:
diff = default_timer() - self._start
print('-- %s: %.6f 秒' % (self._log_label, diff))
@property
def cursor(self):
return self._cursor
【增】
【新增单条记录】
pymysql_create_one.py
#! /usr/bin/python
# -*- coding: UTF-8 -*-
"""
增删改查api
下面记录了最常用的增删改查分页等方法
新增单条记录
"""
from pymysql_comm import UsingMysql
def select_one(cursor):
cursor.execute("select * from Product")
data = cursor.fetchone()
print("-- 单条记录: {0} ".format(data))
# 新增单条记录
def create_one():
with UsingMysql(log_time=True) as um:
sql = "insert into articles(projectid, authorlastname, pub_year, title, abstract, journal, impact, includecriteria) values(%s, %s, %s, %s, %s, %s, %s, %s)"
params = (1, 'Smith', 2023, 'Example Article', 'This is the abstract of the article.', 'Journal of Science', 5.6, 'Criteria for inclusion')
um.cursor.execute(sql, params)
# 查看结果
select_one(um.cursor)
if __name__ == '__main__':
create_one()
【新增多条记录】
pymysql_create_many.py
#! /usr/bin/python
# -*- coding: UTF-8 -*-
"""
新增多条记录
一口气插入1000条记录, 同时加入查询方法, 如下:
原代码是1000条记录插入,现在插入20条即可
"""
from pymysql_comm import UsingMysql
def get_count(cursor):
cursor.execute("select count(id) as total from articles")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
print("-- 当前数量: %d " % data['total'])
def delete_all(cursor):
cursor.execute("delete from articles")
# 插入 20 条记录
def create_many():
with UsingMysql(log_time=True) as um:
# 清空之前的测试记录
delete_all(um.cursor)
for i in range(0, 20):
sql = "insert into articles(projectid, authorlastname, pub_year, title, abstract, journal, impact, includecriteria) values(%s, %s, %s, %s, %s, %s, %s, %s)"
params = (1, 'Smith', 2023, 'Example Article', 'This is the abstract of the article.', 'Journal of Science', 5.6, 'Criteria for inclusion')
um.cursor.execute(sql, params)
# 查看结果
get_count(um.cursor)
if __name__ == '__main__':
create_many()
结果发现是同时插入相同的数据20条
【手动新增多条记录】
手动插入6条记录
pymysql_create_many_1.py
import pymysql
import mysql.connector
# 建立数据库连接
connection = mysql.connector.connect(
host = 'localhost',
port = 3306,
db = 'sqltest',
user = 'root',
password = 'muren123'
)
# 创建游标
cursor = connection.cursor()
# 插入数据
def insert_data(params):
sql = "INSERT IGNORE INTO articles (projectid, authorlastname, pub_year, title, abstract, journal, impact, includecriteria) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
cursor.executemany(sql, params)
connection.commit()
print(cursor.rowcount, "记录已插入")
# 插入的数据
data = [
(1, 'Smith', 2023, 'Example Article', 'This is the abstract of the article.', 'Journal of Science', 5.6, 'Criteria for inclusion'),
(2, 'Johnson', 2023, 'Example Article', 'This is another abstract.', 'Journal of Science', 4.8, 'Criteria for inclusion'),
(3, 'Park', 2023, 'Another Article', 'This is the abstract of another article.', 'International Journal', 3.9, 'Inclusion criteria'),
(4, 'Lee', 2023, 'Unique Article', 'This is a unique article abstract.', 'Journal of Technology', 6.2, 'Criteria for selection'),
(5, 'Wang', 2023, 'Different Article', 'This is a different abstract.', 'Journal of Science', 4.5, 'Inclusion criteria'),
(6, 'Chen', 2023, 'New Article', 'This is a new article abstract.', 'International Journal', 3.7, 'Criteria for inclusion')
]
# 调用插入函数
insert_data(data)
# 关闭游标和连接
cursor.close()
connection.close()
插入成功
【查】
【查找完整表】
pymysql_fectch_1.py
import mysql.connector
# 连接到数据库
connection = mysql.connector.connect(
host = 'localhost',
port = 3306,
db = 'sqltest',
user = 'root',
password = 'muren123'
)
# 创建游标对象
cursor = connection.cursor()
# 执行SQL查询语句
sql = "SELECT * FROM articles" # 假设你的表名为'your_table'
cursor.execute(sql)
# 获取查询结果
results = cursor.fetchall()
# 打印查询结果
for row in results:
print(row)
# 关闭游标和数据库连接
cursor.close()
connection.close()
【查询并列出表中内容id大于或小于的内容】
pymysql_fectch_list.py
#! /usr/bin/python
# -*- coding: UTF-8 -*-
"""
查找
查找主要涉及pymysql 的fetchone(返回单条数据), fetchall(返回所有数据) .
fetchone 上面已经写过了, 现在来看看fetchall 方法:
"""
from pymysql_comm import UsingMysql
def fetch_list_by_filter(cursor, pk):
sql = 'select * from articles where projectid > %d' % pk
cursor.execute(sql)
data_list = cursor.fetchall()
print('-- 总数: %d' % len(data_list))
for row in data_list:
print(row)
return data_list
# 查找
def fetch_list():
with UsingMysql(log_time=True) as um:
# 查找id 大于3的记录
data_list = fetch_list_by_filter(um.cursor, 3)
# 查找id 大于 5 的记录
data_list = fetch_list_by_filter(um.cursor, 5)
if __name__ == '__main__':
fetch_list()
【另一种方法】
pymysql_delete_one.py
#! /usr/bin/python
# -*- coding: UTF-8 -*-
"""
删除某条记录
为了方便测试, 顺便把查的方法也提前写出来了. 代码如下:
"""
from pymysql_comm import UsingMysql
def delete_one(cursor, id):
sql = 'delete from articles where projectid = %s'
params = id
cursor.execute(sql, params)
print('--- 已删除名字为%s的选项. ' % id)
def select_one(cursor):
sql = 'select * from articles'
cursor.execute(sql)
data = cursor.fetchone()
print('--- 已找到名字为%s的选项. ' % data['id'])
return data['id']
def select_one_by_name(cursor, id):
sql = 'select * from articles where projectid = %s'
params = id
cursor.execute(sql, params)
data = cursor.fetchone()
if data:
print('--- 已找到名字为%s的选项. ' % data['id'])
else:
print('--- 名字为%s已经没有了' % id)
# 删除单条记录
def check_delete_one():
with UsingMysql(log_time=True) as um:
# 查找一条记录
name = select_one(um.cursor)
# 删除之
delete_one(um.cursor, id)
# 查看还在不在?
select_one_by_name(um.cursor, id)
if __name__ == '__main__':
check_delete_one()
【删】
pymysql_delete_one_1.py
"""
请确保将上述代码中的your_username、your_password、your_database和
your_table替换为你的实际数据库连接信息。
上述示例中的SQL删除语句是 DELETE FROM your_table WHERE id = %s,
它将删除具有特定id值的行。你可以根据表的结构和需要修改SQL语句来删除符合特定条件的行。还可以使用其他条件如DELETE FROM your_table WHERE column_name = value来删除满足特定条件的行。
执行完删除操作后,你需要通过commit()方法提交事务,将更改保存到数据库中,
并通过close()方法关闭游标和数据库连接。
请记住,对数据库执行删除操作是一项敏感任务,请确保你在操作之前备份好数据,
并仔细检查和验证删除条件,以避免意外删除重要数据
"""
import pymysql
import mysql.connector
# 连接到数据库
connection = mysql.connector.connect(
host = 'localhost',
port = 3306,
db = 'sqltest',
user = 'root',
password = 'muren123'
)
# 创建游标对象
cursor = connection.cursor()
# 执行SQL删除语句
sql = "DELETE FROM articles WHERE projectid = %s" # 假设你的表有一个'id'字段
params = (1,) # 要删除的行的id值为1
cursor.execute(sql, params)
print("记录已删除")
# 提交事务
connection.commit()
# 关闭游标和数据库连接
cursor.close()
connection.close()
删除成功
【改】
pymysql_update_1.py
import mysql.connector
# 连接到数据库
connection = mysql.connector.connect(
host = 'localhost',
port = 3306,
db = 'sqltest',
user = 'root',
password = 'muren123'
)
# 创建游标对象
cursor = connection.cursor()
# 执行UPDATE语句
sql = "UPDATE articles SET includecriteria = 'New criteria' WHERE projectid = 2"
cursor.execute(sql)
# 提交事务
connection.commit()
# 获取受影响的行数
row_count = cursor.rowcount
print(f"Affected rows: {row_count}")
# 关闭游标和数据库连接
cursor.close()
connection.close()
修改成功