使用 read_sql 与访问数据库的 pyODBC 连接是否安全?

Is it safe to use read_sql with a pyODBC connection to an access database?

我发现尽管只支持 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)简单得多。

如果有人有任何见解,我将不胜感激。

需要说明的是,read_sql 仅在使用 DBAPI 连接对象时正式支持 sqlite,在使用 sqlalchemy 引擎时,read_sql 支持您可以为其提供 sqlalchemy 引擎的所有数据库(PostgreSQL、MySQL、SQL 服务器、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-access 项目 (https://bitbucket.org/zzzeek/sqlalchemy-access), but it seems it has not got much attention lately (see also connecting sqlalchemy to MSAccess).

以上适用于read_sql,使用to_sql写入访问数据库肯定行不通(这实际上只适用于sqlite3,因为实现依赖于更多sqlite3特定的东西)。