简体   繁体   English

SQLAlchemy - 简单的select语句

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM