【问题标题】:Python3, MySQL, and SqlAlchemy -- does SqlAlchemy always require a DBAPI?Python3、MySQL 和 SqlAlchemy——SqlAlchemy 是否总是需要 DBAPI?
【发布时间】:2017-11-04 10:03:45
【问题描述】:

我正在将数据库从 sqlite 迁移到 mysql。现在我已经将数据迁移到 mysql,我无法使用我的 sqlalchemy 代码(在 Python3 中)在新的 mysql 数据库中访问它。我的印象是 sqlalchemy 语法与数据库无关(即相同的语法可用于访问 sqlite 和 mysql),但情况似乎并非如此。所以我的问题是:除了 Sqlalchemy 之外,是否绝对需要使用 DBAPI 来读取数据?我是否必须编辑我所有的 sqlalchemy 代码才能现在读取 mysql?

文档说:The MySQL dialect uses mysql-python as the default DBAPI. There are many MySQL DBAPIs available, including MySQL-connector-python and OurSQL,我认为这意味着我确实需要一个 DBAPI。

我使用 sqlite 的旧代码在 sqlite 上成功运行:

engine = create_engine('sqlite:///pmids_info.db')

def connection():
    conn = engine.connect()
    return conn

def load_tables():
    metadata = MetaData(bind=engine) #init metadata. will be empty
    metadata.reflect(engine) #retrieve db info for metadata (tables, columns, types)
    inputPapers = Table('inputPapers', metadata)
    return inputPapers

inputPapers = load_tables()

def db_inputPapers_retrieval(user_input):
    result = engine.execute("select title, author, journal, pubdate, url from inputPapers where pmid = :0", [user_input])
    for row in result:
        title = row['title']
        author = row['author']
        journal = row['journal']
        pubdate = row['pubdate']
        url = row['url']
        apa = str(author+' ('+pubdate+'). '+title+'. '+journal+'. Retrieved from '+url)
        return apa

这工作得很好而且花花公子。所以然后我尝试更新它以使用 mysql 数据库,如下所示:

engine = create_engine('mysql://snarkshark@localhost/pmids_info')

起初,当我尝试像这样运行我的示例代码时,它抱怨说我没有MySqlDB。一些谷歌搜索告诉我 MySqlDB 不适用于 Python 3。所以我尝试 pip 安装 pymysql 并将我的引擎语句更改为

engine = create_engine('mysql+pymysql://snarkshark@localhost/pmids_info')

当我尝试调整时,这最终也会给我带来各种语法错误。

所以我想知道的是,是否有任何方法可以让我当前的语法与 mysql 一起使用?由于语法来自 sqlalchemy,我认为它可以完美地用于 mysql 中与之前在 sqlite 中的完全相同的数据。我是否必须通过并更新我的所有数据库函数才能使用 DBAPI 的语法?

【问题讨论】:

    标签: mysql database python-3.x sqlite sqlalchemy


    【解决方案1】:

    这听起来像是一个愚蠢的答案,但您需要更改所有使用数据库特定行为的地方。 SQLAlchemy 不保证你用它做的任何事情都可以在所有后端移植。它故意泄漏了一些抽象,以允许您执行仅在某些后端可用的事情。你所做的就像使用 Python,因为它是跨平台的,然后到处都在做一堆 os.fork()s,然后惊讶于它在 Windows 上不起作用。

    对于您的特定情况,您至少需要将所有原始 SQL 包装在 text() 中,这样您就不会受到 DBAPI 支持的 paramstyle 的影响。但是,不同的 SQL 方言之间仍然存在细微差别,因此如果您想要可移植性,则需要使用 SQLAlchemy SQL expression language 而不是原始 SQL。毕竟,您仍然需要注意不要在 SQL 表达式语言中使用特定于后端的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-18
      • 2018-02-27
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多