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