Используйте orm на sqlalchemy отраженных таблиц - PullRequest
0 голосов
/ 01 марта 2020

Я использую Python Версия: 3.7.3 (по умолчанию, 27 марта 2019, 17:13:21) [MS C v.1915 64 бит (AMD64)] Pandas Версия: 0.25.3

У меня есть два кадра данных

import pandas as pd

data = {'PID':[739453003, 739453003, 578598449],
        'name':['name_1', 'name_2', 'name_3']}

df1 = pd.DataFrame(data)
df2 = pd.DataFrame(data)

, и я хочу преобразовать в sql, и с помощью sqlalchemy отразить их в целом и query в сгенерированных классах. После поиска я закончил со следующим кодом, но сгенерированные классы не будут иметь метод query.

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.declarative import DeferredReflection
from sqlalchemy.engine import reflection

eng = create_engine('sqlite:///:memory:', echo=False)

df.to_sql('df1', eng, schema='main', if_exists='replace', index=False)
df.to_sql('df2', eng, schema='main', if_exists='replace', index=False)

Base = declarative_base(eng)

class Df1(DeferredReflection, Base):
    __tablename__ = 'df1'
class Df2(DeferredReflection, Base):
    __tablename__ = 'df2'

insp = reflection.Inspector.from_engine(eng)
print(insp.get_table_names())
['df1', 'df2']
print(get_class_by_tablename('df1', Base))
print(get_class_by_tablename('df2', Base))
<class '__main__.Df1'>
<class '__main__.Df2'>

Теперь

print(Df1.query.all())

выдает сообщение об ошибке

AttributeError                            Traceback (most recent call last)
<ipython-input-108-26c06e0e3d75> in <module>
----> 1 print(Df1.query.all())

AttributeError: type object 'Df1' has no attribute 'query'

Любые предложения о том, как я могу получить доступ к методам предоставляется sqlalchemy, как если бы классы моделей были сконструированы явно?

(get_class_by_tablename определение)

def get_class_by_tablename(table_fullname, base):
    for c in base._decl_class_registry.values():
        if hasattr(c, '__table__') and c.__table__.fullname == table_fullname:
            return c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...