【问题标题】:Is it safe to use read_sql with a pyODBC connection to an access database?将 read_sql 与 pyODBC 连接使用到访问数据库是否安全?
【发布时间】:2015-03-18 22:29:21
【问题描述】:

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

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    需要明确的是,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-access 项目 (https://bitbucket.org/zzzeek/sqlalchemy-access),但最近似乎没有引起太多关注(另请参阅 connecting sqlalchemy to MSAccess)。

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

    【讨论】:

    • 非常感谢。您对支持的解释非常有帮助。我正在处理检索和分析存储在遗留数据库中的数据,并且了解使用 read_sql 的风险很重要。看起来这会很好,特别是如果我冻结了我的应用程序支持的 pandas 版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多