在实践数据剖析和建模过程中,咱们通常需求从数据库中读取数据,并将其转化为 Pandas dataframe 目标进行进一步处理。而 MySQL 数据库是最常用的关系型数据库之一,因而在 Python 中如何衔接 MySQL 数据库并查询数据成为了一个重要的问题。
本文将介绍两种办法来衔接 MySQL 数据库,并将查询成果转化为 Pandas dataframe 目标:榜首种办法运用 pymysql 库来衔接 MySQL 数据库;第二种办法则运用 SQLAlchemy 的 create_engine 函数创立 MySQL 数据库衔接引擎。一起,针对这两种办法,咱们还将对代码进行封装和优化,提高程序的可读性和健壮性。
办法一:运用 pymysql 库衔接 MySQL 数据库
过程 1:衔接 MySQL 数据库
首要,咱们需求运用 pymysql 库来衔接 MySQL 数据库。详细代码如下:
import pymysql
# 衔接 MySQL 数据库
conn = pymysql.connect(
host='159.xxx.xxx.216', # 主机名
port=3306, # 端口号,MySQL默以为3306
user='xxxx', # 用户名
password='xxxx', # 暗码
database='xx', # 数据库称号
)
在上面的代码中,咱们通过 pymysql 库的 connect() 函数衔接 MySQL 数据库,并指定主机名、端口号、用户名、暗码和数据库称号等参数。假如衔接成功,则该函数将回来一个数据库衔接目标 conn。
过程 2:履行 SQL 查询句子
衔接 MySQL 数据库之后,咱们就能够运用游标目标来履行 SQL 查询句子,如下所示:
# 创立游标目标
cursor = conn.cursor()
# 履行 SQL 查询句子
cursor.execute("SELECT * FROM users WHERE gender='female'")
# 获取查询成果
result = cursor.fetchall()
在上面的代码中,咱们运用 cursor() 办法创立游标目标 cursor,并运用 execute() 办法履行 SQL 查询句子。在履行查询时,咱们能够运用任何契合 MySQL 语法的 SQL 查询句子。最终,咱们运用 fetchall() 办法获取查询成果。
过程 3:将查询成果转化为 Pandas dataframe 目标
获取查询成果之后,咱们需求将其转化为 Pandas dataframe 目标,以便于进行进一步的数据处理和剖析。详细代码如下
import pandas as pd
# 将查询成果转化为 Pandas dataframe 目标
df = pd.DataFrame(result, columns=[i[0] for i in cursor.description])
在上面的代码中,咱们运用 pd.DataFrame() 办法将查询成果转化为 Pandas dataframe 目标。在转化过程中,咱们需求指定字段名,能够通过游标目标的 description 特点来获取查询成果的元数据,其间包括字段名等信息。
过程 4:封闭游标和数据库衔接
最终,咱们需求封闭游标目标和数据库衔接,以开释资源。详细代码如下:
# 封闭游标和数据库衔接
cursor.close()
conn.close()
办法二:运用 SQLAlchemy 的 create_engine 函数衔接 MySQL 数据库
除了运用 pymysql 库衔接 MySQL 数据库之外,咱们还能够运用 SQLAlchemy 的 create_engine 函数创立 MySQL 数据库衔接引擎,并运用 Pandas 库中的 read_sql 函数直接将查询成果转化为 Pandas dataframe 目标。
# 过程 1:创立 MySQL 数据库衔接引擎
from sqlalchemy import create_engine
# 创立 MySQL 数据库衔接引擎
engine = create_engine('mysql+pymysql://username:password@host:port/database')
过程 2:履行 SQL 查询句子并将成果转化为 Pandas dataframe 目标
import pandas as pd
# 履行 SQL 查询句子,并将成果转化为 Pandas dataframe 目标
df = pd.read_sql("SELECT * FROM users WHERE gender='female'", con=engine)
# 封闭数据库衔接
engine.dispose()
在上面的代码中,咱们运用 create_engine 函数创立了一个 MySQL 数据库衔接引擎。其间,咱们需求将数据库衔接信息输入到一个字符串中,并作为函数的参数传入。其间,username 和 password 分别表明登录 MySQL 数据库所需的用户名和暗码,host 和 port 表明 MySQL 数据库的主机名和端口号,database 表明要衔接的 MySQL 数据库称号。
接着运用运用 pd.read_sql() 函数履行 SQL 查询句子,并将数据库衔接引擎目标 engine 作为参数传入。在履行查询时,咱们能够运用任何契合 MySQL 语法的 SQL 查询句子。最终,该函数将回来查询成果的 Pandas dataframe 目标。
最终,咱们需求封闭数据库衔接,以开释资源。
函数封装
以上介绍了两种办法来衔接 MySQL 数据库,并将查询成果转化为 Pandas dataframe 目标。为了便利重复运用,咱们能够将这些代码封装成一个函数。
import pandas as pd
import pymysql
from sqlalchemy import create_engine
def query_mysql(sql_query, host=None, port=None, user=None, password=None, database=None, engine=None):
"""
衔接 MySQL 数据库,履行查询,并将查询成果转化为 Pandas DataFrame 目标。
:param sql_query: SQL 查询句子
:param host: 主机名,默以为 None
:param port: 端口号,默以为 None
:param user: 用户名,默以为 None
:param password: 暗码,默以为 None
:param database: 数据库称号,默以为 None
:param engine: SQLAlchemy 的数据库引擎目标,默以为 None
:return: Pandas DataFrame 目标
"""
# 假如未供给数据库衔接引擎,则运用 pymysql 库衔接 MySQL 数据库
if engine is None:
# 衔接 MySQL 数据库
conn = pymysql.connect(
host=host,
port=port,
user=user,
password=password,
database=database,
)
# 创立游标目标
cursor = conn.cursor()
# 履行 SQL 查询句子
cursor.execute(sql_query)
# 获取查询成果
result = cursor.fetchall()
# 将查询成果转化为 Pandas DataFrame 目标
df = pd.DataFrame(result, columns=[i[0] for i in cursor.description])
# 封闭游标和数据库衔接
cursor.close()
conn.close()
# 假如已供给数据库衔接引擎,则运用 SQLAlchemy 库衔接 MySQL 数据库
else:
# 履行 SQL 查询句子,并将成果转化为 Pandas DataFrame 目标
df = pd.read_sql(sql_query, con=engine)
return df
在上面的代码中,咱们创立了一个名为 query_mysql 的函数,用于衔接 MySQL 数据库,并履行查询操作。该函数接受以下参数:
- sql_query:SQL 查询句子;
- host:主机名,默以为 None;
- port:端口号,默以为 None;
- user:用户名,默以为 None;
- password:暗码,默以为 None;
- database:数据库称号,默以为 None;
- engine:SQLAlchemy 的数据库引擎目标,默以为 None。
在函数中,咱们首要判断是否已供给数据库衔接引擎目标。假如未供给,则运用 pymysql 库衔接MySQL 数据库,并履行查询操作,过程与前面的榜首种办法相同。假如已供给数据库衔接引擎目标,则运用 SQLAlchemy 库衔接 MySQL 数据库,并履行查询操作,过程与前面的第二种办法相同。
最终,在函数中咱们回来查询成果的 Pandas dataframe 目标。
# 运用 pymysql 库衔接 MySQL 数据库
df1 = query_mysql(
sql_query="SELECT * FROM users WHERE gender='female'",
host='159.xxx.xxx.216', # 主机名
port=3306, # 端口号,MySQL默以为3306
user='xxxx', # 用户名
password='xxxx', # 暗码
database='xx', # 数据库称号
)
# 运用 SQLAlchemy 库衔接 MySQL 数据库
engine = create_engine('mysql+pymysql://xxx:xxx@localhost:3306/ad')
df2 = query_mysql(sql_query="SELECT * FROM users WHERE gender='female'", engine=engine)
通过运用 query_mysql 函数,咱们能够更加便利地衔接 MySQL 数据库并查询数据,而且代码量更少、可读性更好。一起,因为该函数运用了 pymysql 和 SQLAlchemy 两个库,因而也具有较好的跨渠道性,能够在不同的操作系统和环境下运转。
最终也共享一下个人通过运用的模板:
# 法一:
import pymysql
import pandas as pd
def query_data(sql_query):
# 衔接数据库
conn = pymysql.connect(
host='xxx.xxx.xxx.xxx', # 主机名
port=3306, # 端口号,MySQL默以为3306
user='xxx', # 用户名
password='xxx', # 暗码
database='xxx', # 数据库称号
)
try:
# 创立游标目标
cursor = conn.cursor()
# 履行 SQL 查询句子
cursor.execute(sql_query)
# 获取查询成果
result = cursor.fetchall()
# 获取查询成果的字段名和元数据
columns = [col[0] for col in cursor.description]
# 将查询成果封装到 Pandas DataFrame 中
df = pd.DataFrame(result, columns=columns)
return df
finally:
# 封闭游标和衔接
cursor.close()
conn.close()
db_data = query_data(sql_query)
# 法二:
from sqlalchemy import create_engine
import pandas as pd
def getdata_from_db(query, db, host='xxx.xxx.xxx.xxx', port=3306, user='xxx', password='xxx'):
try:
engine = create_engine(f'mysql+pymysql://{user}:{password}@{host}:{port}/{db}?charset=utf8')
# 运用 with 句子自动办理衔接的生命周期
with engine.connect() as conn:
data = pd.read_sql(query, conn)
return data
except Exception as e:
print(f"Error occurred when executing SQL query: {e}")
return None
db_data = getdata_from_db(sql_query, 'ad')
# 法三:超级精简版
from sqlalchemy import create_engine
import pandas as pd
engine = create_engine(f'mysql+pymysql://xxx:xxx@xxx:3306/xx?charset=utf8')
db_data = pd.read_sql(sql, engine)
db_data.head()
最终,说一下在访问数据库时,或许存在一些潜在的问题和注意事项。
- 首要,在运用 pandas.read_sql() 时,需求在 SQL 查询句子中包含一切必要的过滤条件、排序方法等信息,以确保回来的成果集合是正确的,而不是整个表或视图中的一切数据。假如没有限制回来的数据量,或许会导致内存溢出或其他性能问题。因而,在实践运用中,引荐运用 LIMIT 等关键字来设置最大回来数据量,以便更好地控制查询成果。
- 其次,在实践出产环境中,为了防止泄漏灵敏信息和削减攻击面,建议将数据库衔接字符串等灵敏信息存储在独自的配置文件中,而且只授权给有限的用户运用。另外,在向 SQL 查询句子中传递参数时,也需求进行安全过滤和转义,以防止 SQL 注入等安全问题。
- 最终,在运用完毕后,需求及时封闭数据库衔接,以开释资源并削减数据库服务器的负载。或许,能够运用 with 句子自动办理衔接的生命周期。
总归,学习如何衔接 MySQL 数据库并将查询成果转化为 Pandas dataframe 目标是数据剖析和建模过程中的重要一步。希望本文对您有所帮助!
本文由mdnice多渠道发布