我发现尽管只支持sqlite,但pandas.io.sql.read_sql方法可以通过查询Microsoft Access数据库来创建数据帧。
driver_string="DRIVER={Microsoft Access Driver (*.mdb)}"
file_string = "DBQ="+"test.mdb"
connection_string = ";".join([driver_string, file_string])
cnxn = pyodbc.connect(connection_string)
cursor = cnxn.cursor()
df = pd.read_sql("SELECT * FROM testTable", con=cnxn, index_col = ["indexCol"])
我对阅读数据更感兴趣,不太可能回写到数据库。我还使用包含连接的更复杂查询对此进行了测试,但它似乎运行良好。
有人能告诉我这里有危险吗?这似乎比使用SQLAlchemy(它也不支持Access)简单得多。
我很感激任何人的洞察力。
答案 0 :(得分:2)
要明确,read_sql
在使用DBAPI连接对象时才正式支持sqlite,使用sqlalchemy引擎时,read_sql
支持所有可以提供sqlalchemy引擎的数据库(PostgreSQL,MySQL, SQL Server,Oracle,..等等,请参阅http://docs.sqlalchemy.org/en/rel_0_9/dialects/index.html)。
但确实,虽然只有sqlite被官方支持,但它也适用于其他数据库。目前,sqlite后备的实现仅依赖于conn.cursor()
,cursor.execute()
方法以及cursor.fetchmany()
或cursor.fetchall()
方法的可用性。
因此,只要您的连接对象提供这些(并且如果它符合DBAPI2,它将会),这将起作用。
虽然将来很可能不会改变,但不能保证(它仅针对sqlite3进行了测试)。请注意,有一个sqlalchemy访问项目(https://bitbucket.org/zzzeek/sqlalchemy-access),但最近似乎没有引起太多关注(另见connecting sqlalchemy to MSAccess)。
对于read_sql
,上面的描述是正确的,用to_sql
写入访问数据库肯定不会起作用(这实际上只适用于sqlite3,因为实现依赖于更多sqlite3特定的东西)。