Python3、MySQL和SqlAlchemy——SqlAlchemy是否总是需要DBAPI?

Python3、MySQL和SqlAlchemy——SqlAlchemy是否总是需要DBAPI?,mysql,database,python-3.x,sqlite,sqlalchemy,Mysql,Database,Python 3.x,Sqlite,Sqlalchemy,我正在将数据库从sqlite迁移到mysql。现在我已经将数据迁移到mysql,我无法在新的mysql数据库中使用我的sqlalchemy代码(在Python3中)来访问它。我的印象是sqlalchemy语法与数据库无关(即,访问sqlite和mysql时使用相同的语法),但情况似乎并非如此。所以我的问题是:除了Sqlalchemy之外,是否绝对需要使用DBAPI来读取数据?我必须编辑所有的sqlalchemy代码才能阅读mysql吗 文档中说:MySQL方言使用MySQL-python作为默认

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

文档中说:
MySQL方言使用MySQL-python作为默认DBAPI。有很多MySQL DBAPI可用,包括MySQL连接器python和我们的SQL
,我想这意味着我确实需要一个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 db,如下所示:

engine = create_engine('mysql://snarkshark@localhost/pmids_info')
起初,当我试图像这样运行示例代码时,它抱怨说因为我没有
MySqlDB
。一些谷歌用户告诉我MySqlDB不适用于python3。因此,我尝试了pip安装
pymysql
,并将我的引擎语句更改为

engine = create_engine('mysql+pymysql://snarkshark@localhost/pmids_info')
当我尝试调整时,也会出现各种语法错误


所以我想知道的是,是否有任何方法可以让我当前的语法与mysql一起工作?由于语法来自sqlalchemy,我认为它可以完美地用于mysql中与以前sqlite中完全相同的数据。为了使用DBAPI的语法,我需要检查并更新所有的db函数吗

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

对于您的特定情况,您至少需要将所有原始SQL打包,这样您就不会受到DBAPI支持的paramstyle的影响。然而,SQL的不同方言之间仍然存在细微的差异,因此如果您想要可移植性,就需要使用SQLAlchemy而不是原始SQL。在所有这些之后,您仍然需要小心不要在SQL表达式语言中使用后端特定的功能