2017-02-20 5 views
1

фона:SQLAlchemy - простой оператор выбора

Я очень новой для SQLAlchemy и это, кажется, довольно запутанным, каким я должен быть выбор вещей.

У меня есть таблица в моей базе данных MySQL, который называется гены, где я gene_id, gene_description и gene_symbol

Что я хочу сделать:

Все, что я хочу сделать, это просто выберите запрос:

Select * from Genes 

Но я, кажется, следует путать, как мы достигнем этого

Вот что я сделал:

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:[email protected]') # connect to server 
metadata = sqlalchemy.MetaData(bind=engine) 
engine.execute("USE TestDB") 

genes = sqlalchemy.table('Genes') 
s = sqlalchemy.select([genes]) 
engine.execute(s) 

Проблема:

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`'] 

также есть некоторый тип "IntelliSense", где я могу просто сделать что-то вроде gene_table = engine.Gene. Если я не ошибаюсь, есть способ сделать это с отображением, но это не работает для меня

EDIT: Это может помочь:

How to automatically reflect database to sqlalchemy declarative?

+1

Вы не указали ни одной строки в таблице, поэтому запрос выдается синтаксическая ошибка из-за пустой список выражений. Вы должны либо определить столбцы (либо вручную, либо через отражение), либо, если вы действительно хотите «SELECT * ...», выполните 'select ([" * "]). Select_from (genes)'. – univerio

ответ

1

Таким образом, мы можем использовать отражение и не должны создавать классы в явном виде, но если мы хотим, чтобы скорость, мы можем создать их, используя что-то вроде sqlautocode, как указано здесь:

Reverse engineer SQLAlchemy declarative class definition from existing MySQL database?

также есть проблема с базы данных MySQL, где он будет давать ошибку, которая выглядит следующим образом: (взято из BitBucket: https://bitbucket.org/zzzeek/sqlalchemy/issues/1909/reflection-issue-with-mysql-url-with-no)

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' 

Это решается путем добавления имя базы данных (тот, который вы используете) следующим образом:

engine = create_engine('mysql+mysqldb://USER_NAME:[email protected]/DATABASE_NAME', pool_recycle=3600) # connect to server 

Я использовал это, чтобы правильно подключить: http://docs.sqlalchemy.org/en/latest/orm/extensions/automap.html и это: http://docs.sqlalchemy.org/en/latest/core/engines.html

Это также может помочь: How to automatically reflect database to sqlalchemy declarative?

Мой код, наконец, выглядит следующим образом:

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:[email protected]/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) 
+0

Я просто получил ошибку «NoneType», я бы сказал, что стоит добавить его к самому вопросу :) –

+0

Как ссылка, у вас ДОЛЖЕН иметь первичный ключ, чтобы сделать автоматизацию. В противном случае это не будет автоматически: https://stackoverflow.com/questions/23765681/sqlalchemy-automap-does-not-create-class-for-tables-without-primary-key – Kevin