Python3、MySQL和SqlAlchemy——SqlAlchemy是否总是需要DBAPI?
我正在将数据库从sqlite迁移到mysql。现在我已经将数据迁移到mysql,我无法在新的mysql数据库中使用我的sqlalchemy代码(在Python3中)来访问它。我的印象是sqlalchemy语法与数据库无关(即,访问sqlite和mysql时使用相同的语法),但情况似乎并非如此。所以我的问题是:除了Sqlalchemy之外,是否绝对需要使用DBAPI来读取数据?我必须编辑所有的sqlalchemy代码才能阅读mysql吗 文档中说: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作为默认
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表达式语言中使用后端特定的功能