我们将使用sakila数据库,MYSQL的示例。
借助pyodbc库(您也可以使用MYSQLDB库),我们可以创建到数据库的连接字符串:
#Connection to MYSQL Server
import pyodbc
mydb = pyodbc.connect("DRIVER={MySQL ODBC 8.0 ANSI Driver}; SERVER=localhost; PORT=3306;DATABASE=sakila; UID=root; PASSWORD=12345;")
注意:要使用PYODBC库,您需要为使用的数据库系统安装一个有效的ODBC连接器。
我们可以做的整洁的事情之一是使用python格式化功能,通过提示用户输入用户名和密码来为连接字符串提供参数-避免显式输入密码:
user = input('Provide user: \n')
pwd = input('Provide password: \n')
mydb = pyodbc.connect("DRIVER={MySQL ODBC 8.0 ANSI Driver}; SERVER=localhost; PORT=3306;DATABASE=sakila; UID=%s; PASSWORD=%s;" % (user, pwd))
注意,user和pwd将如何替换连接字符串中的%s,使其等效于第一个示例。
要使用pyodbc查询数据库,只需创建一个游标并执行所需的任何查询。 在示例中,我们将从电影数据库中选择“标题和发行年份”(无需显式数据库名称,因为我们在连接中仅与之连接):
cursor = mydb.cursor()
cursor.execute('select title, release_year from film')
在运行查询之后,我们可以使用以下方法获得结果:
cursor.fetchall()
但是有一个警告,cursor.fetchall()返回Python列表,而不是存储表格数据的最有效/用户友好的方法。
#Movie name and title returning from query list
[('ACADEMY DINOSAUR', 2006),
('ACE GOLDFINGER', 2006),
('ADAPTATION HOLES', 2006),
('AFFAIR PREJUDICE', 2006),
('AFRICAN EGG', 2006)]
我们可以使用以下命令将此对象转换为pandas DataFrame(df):
movies_release_year = pd.DataFrame([tuple(t) for t in cursor.fetchall()])
如果检查Movies_release_year的dataframe,则该对象看起来很奇怪,因为它没有有关该表的列名或其他元数据。
幸运的是,pandas为我们提供了一种在基础查询中将SQL表转换为DataFrames的巧妙方法-输入pandas read_sql_query方法:
movies_release_year = pd.read_sql_query('select title, release_year from film', mydb)
如果您使用movies_release_year.columns和movies_release_year.index检查movies_release_year的对象元数据,则会得到以下输出:
#For columns
Index(['title', 'release_year'], dtype='object')
#For row indexes
RangeIndex(start=0, stop=1000, step=1)
现在,列名正确显示,我们可以从对象数据框中使用movies_release_year [“ title”]或movies_release_year.title来调用它们。SQL等效于“select title from film”,但是行索引有些麻烦,自然,我们的查询没有读取“主键/索引”。 Pandas dataframe索引函数类似于SQL表索引,并且要显式索引的列,我们可以简单地将参数传递给read_sql_query:
movies_release_year = pd.read_sql_query('select film_id, title, release_year from film', mydb, index_col = 'title')
详情参阅http://viadean.com/pandas_do_mysql.html