簡體   English   中英

如何擴充SQLAlchemy中的聲明式基礎

[英]How to augment the declarative base in SQLAlchemy

我正在按照Mike Bayer的SQLAlchemy文檔進行操作,並嘗試按照下面的代碼擴展declarative_base時遇到一些問題。

模塊db.base

from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy import Column, Date, Integer, String

class Base(object):
    @classmethod
    @declared_attr
    def __tablename__(cls):
        print(">>__tablename__() "+str(cls.__name__.lower()))
        return cls.__name__.lower()
    id = Column(Integer, primary_key=True, nullable = False)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base(cls=Base)

db.dbtest模塊

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from db.base import Base
engine = create_engine('sqlite:////tmp/test.db', echo=True)
db_session = scoped_session(sessionmaker(autocommit=False,
                                autoflush=False,
                                bind=engine))

def init_db():
    import db.model.testdata 
    base = Base()
    base.metadata.create_all(bind=engine)

if __name__ == '__main__':
   init_db()

模塊db.model.testdata

from db.base import Base
from sqlalchemy import Boolean, Column, Date, Integer, String
from sqlalchemy import REAL

class TestData(Base):
    name = Column(String(255), nullable = False)
    creationDate =  Column(Date, index=True)
    updateDate =  Column(Date, index=True)
    miscData = Column(REAL, nullable = True)

在SQLAlchemy文檔中,@classmethod批注未添加到基類的tablename方法中。 但是,如果沒有它,我將收到“方法'tablename-db.base'應該具有self作為第一個參數”錯誤,基本上是說@declared_attr並未將該方法標記為類級別方法。 您應該添加@classmethod還是我正在使用的版本(0.9.8)中的錯誤?

基本增強器返回的表名是db.model.testdata.TestData類的“綁定方法DeclarativeMeta。?”,如何才能僅獲得返回的類名(TestData)?

另一個小問題-Base類的tablename方法中的print()調用不會打印任何內容(記錄器也不會打印),而且我不確定為什么。

我生成一個隱秘的表名的原因以及打印調用為何不起作用的原因是,未調用Base類中的tablename方法(由於具有@classmethod批注)。

問題似乎出在PyDev。 我在PyCharm中運行了相同的代碼,PyCharm在@declared_attr批注中沒有問題,並且不需要@classmethod。

在PyDev中,我將sqlalchemy添加到了強制內置程序(“窗口->首選項-> PyDev->解釋器-> Python解釋器->強制內置程序”)。 然后,我刪除了@classmethod注釋並重新運行它。 我仍然在代碼上得到“方法表名 -db.base應該以self作為第一個參數”錯誤標記,但現在可以正常運行了。

我仍然在代碼上得到“方法表名-db.base應該以self作為第一個參數”錯誤標記,但現在可以正常運行了。

如果這讓您感到煩惱,並且對PyDev指出的錯誤感到好奇,則可以按Control+1並將該行標記為# @NoSelf 這通知PyDev您的方法沒有以self作為其第一個參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM