[英]SQLAlchemy - simple select statement
Background: 背景:
I am very new to SQLAlchemy and it seems to be fairly confusing as to how I should be selecting things. 我是SQLAlchemy的新手,对于我应该如何选择东西似乎相当混乱。
I have a table in my mysql database which is called genes, where I have gene_id, gene_description, and gene_symbol 我的mysql数据库中有一个表叫做基因,我有gene_id,gene_description和gene_symbol
What I want to do: 我想做的事:
All I want to do is a simple select query: 我想做的只是一个简单的选择查询:
Select * from Genes
But I seem to be confused as to how we shall achieve this 但我似乎对如何实现这一目标感到困惑
Here is what I have done: 这是我做的:
import sqlalchemy
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.automap import automap_base
import csv
import pandas as pd
engine = sqlalchemy.create_engine('mysql://root:toor@localhost') # connect to server
metadata = sqlalchemy.MetaData(bind=engine)
engine.execute("USE TestDB")
genes = sqlalchemy.table('Genes')
s = sqlalchemy.select([genes])
engine.execute(s)
The problem: 问题:
ProgrammingError: (_mysql_exceptions.ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM `Genes`' at line 2") [SQL: u'SELECT \nFROM `Genes`']
Also is there some type of "intellisense" where I can just do something like gene_table = engine.Gene. 还有一些类型的“intellisense”,我可以做一些像gene_table = engine.Gene。 If I am not mistake there is a way to do this with mapping but it didn't work for me 如果我没有错误,有一种方法可以用映射做到这一点,但它对我不起作用
EDIT: This may help: 编辑:这可能会有所帮助:
How to automatically reflect database to sqlalchemy declarative? 如何自动将数据库反映到sqlalchemy声明中?
So we can use reflection and do not have to create classes explicitly, but if we want speed we can create them using something like sqlautocode as stated here: 所以我们可以使用反射而不必显式创建类,但如果我们想要速度,我们可以使用sqlautocode创建它们,如下所述:
Reverse engineer SQLAlchemy declarative class definition from existing MySQL database? 从现有的MySQL数据库中反向设计SQLAlchemy声明性类定义?
Also there is an issue with mysql databases where it will give an error that looks like the following: (taken from bitbucket: https://bitbucket.org/zzzeek/sqlalchemy/issues/1909/reflection-issue-with-mysql-url-with-no ) 此外,mysql数据库存在一个问题,它会产生如下错误:(取自bitbucket: https ://bitbucket.org/zzzeek/sqlalchemy/issues/1909/reflection-issue-with-mysql-url - 没有 )
SNIP...
File "/opt/buildout-eggs/SQLAlchemy-0.6.4-py2.5.egg/sqlalchemy/schema.py", line 1927, in __init__
self.reflect()
File "/opt/buildout-eggs/SQLAlchemy-0.6.4-py2.5.egg/sqlalchemy/schema.py", line 2037, in reflect
connection=conn))
File "/opt/buildout-eggs/SQLAlchemy-0.6.4-py2.5.egg/sqlalchemy/engine/base.py", line 1852, in table_names
return self.dialect.get_table_names(conn, schema)
File "<string>", line 1, in <lambda>
File "/opt/buildout-eggs/SQLAlchemy-0.6.4-py2.5.egg/sqlalchemy/engine/reflection.py", line 32, in cache
return fn(self, con, *args, **kw)
File "/opt/buildout-eggs/SQLAlchemy-0.6.4-py2.5.egg/sqlalchemy/dialects/mysql/base.py", line 1791, in get_table_names
self.identifier_preparer.quote_identifier(current_schema))
File "/opt/buildout-eggs/SQLAlchemy-0.6.4-py2.5.egg/sqlalchemy/sql/compiler.py", line 1517, in quote_identifier
return self.initial_quote + self._escape_identifier(value) + self.final_quote
File "/opt/buildout-eggs/SQLAlchemy-0.6.4-py2.5.egg/sqlalchemy/dialects/mysql/mysqldb.py", line 77, in _escape_identifier
value = value.replace(self.escape_quote, self.escape_to_quote)
AttributeError: 'NoneType' object has no attribute 'replace'
This is resolved by adding a database name (the one you are using) as follows: 这可以通过添加数据库名称(您正在使用的名称)来解决,如下所示:
engine = create_engine('mysql+mysqldb://USER_NAME:PASSWORD@127.0.0.1/DATABASE_NAME', pool_recycle=3600) # connect to server
I used this to connect correctly: http://docs.sqlalchemy.org/en/latest/orm/extensions/automap.html and this: http://docs.sqlalchemy.org/en/latest/core/engines.html 我使用它来正确连接: http : //docs.sqlalchemy.org/en/latest/orm/extensions/automap.html和这: http : //docs.sqlalchemy.org/en/latest/core/engines.html
This also may help: How to automatically reflect database to sqlalchemy declarative? 这也可能有所帮助: 如何自动将数据库反映到sqlalchemy声明中?
My code finally looks like this: 我的代码最终看起来像这样:
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session
from sqlalchemy import create_engine
Base = automap_base()
# engine, suppose it has two tables 'user' and 'address' set up
engine = create_engine('mysql+mysqldb://root:toor@127.0.0.1/TestDB', pool_recycle=3600) # connect to server
# reflect the tables
Base.prepare(engine, reflect=True)
# mapped classes are now created with names by default
# matching that of the table name.
Genes = Base.classes.Genes
Address = Base.classes.address
#Start Session
session = Session(engine)
#add a row:
session.add(Genes(Gene_Id=1,Gene_Symbol = "GENE_SYMBOL", Gene_Description="GENE_DESCRIPTION"))
session.commit()
q = session.query(Genes).all()
for gene in q:
print "This is the Gene ID {},\n This is the Gene Desc {},\n this is the Gene symbol {}.".format(gene.Gene_Id,gene.Gene_Description, gene.Gene_Symbol )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.