使用 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特定的东西)。
我发现尽管只支持 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特定的东西)。