使用flask-sqlalchemy而没有子类声明基础

use*_*818 9 python sqlalchemy flask flask-sqlalchemy

我正在使用Flask作为我的python wsgi服务器,而sqlalchemy使用我的所有数据库访问.

我想在我的应用程序中使用Flask-Sqlalchemy扩展,但我不想使用声明性基类(db.Model),相反,我想使用sqlalchemy.ext.declarative中的基类.

这是否会破坏使用扩展程序的全部目的?


我的用例:

我想扩展程序可以帮助我更好地管理会话/引擎,但我想分别处理所有模型.

我实际上不介意使用扩展,但我想编写严格的模型.我正在从一个非烧瓶应用程序移植代码,我会在我去的时候将更改推回到该项目.例如,如果flask-sqlalchemy允许我欺骗表元数据,那么当代码被推回时会导致问题.我的代码中还有一些代码可以进行大量的类型检查(多态身份),我还记得在使用扩展时不建议读取表格上的类型检查.

dav*_*ism 7

你可以让Flask-SQLAlchemy公开你自己的基础模型而不是它的内置模型.只是子类SQLAlchemy和覆盖make_declarative_base.

from flask.ext.sqlalchemy import SQLAlchemy


class CustomAlchemy(SQLAlchemy):
    def make_declarative_base(self):
        base = declarative_base(...)
        ...
        return base

db = CustomAlchemy()
Run Code Online (Sandbox Code Playgroud)


Nic*_*ams 0

SQLAlchemy 本身实际上建议您对 Flask 项目使用 Flask 包装器 (db.Model)。话虽这么说,我已经在我的几个 Flask 项目中使用了 declarative_base 模型,它更有意义。

它确实违背了 Flask-sqlalchemy 中 SQLAlchemy 类的全部目的。

这是一些示例代码:

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
import datetime

#set up sqlalchemy
engine = create_engine('postgresql://<username>:<password>@localhost/flask_database')
Base = declarative_base()
metadata = Base.metadata
metadata.bind = engine
Session = sessionmaker(bind=engine, autoflush=True)
session = Session()


class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    api_owner_id = Column(Integer, ForeignKey('api.id'))
    email = Column(String(120), unique=True)
    username = Column(String(120), unique=True)
    first_name = Column(String(120))
    last_name = Column(String(120))
    business_name = Column(String(120))
    account_type = Column(String(60))
    mobile_phone = Column(String(120))
    street = Column(String(120))
    street2 = Column(String(120))
    city = Column(String(120))
    state = Column(String(120))
    zip_code = Column(String(120))
    country = Column(String(120))
    creation_date = Column(DateTime, default=datetime.datetime.now())
    password = Column(String(120))
    #github stuffs
    github_link = Column(Boolean, default=False)
    github_usn = Column(String(120))
    github_oauth_token = Column(String(160))
    #balanced stuffs
    balanced_account_uri = Column(String(120))
    ach_verified = Column(Boolean, default=False)
    active = Column(Boolean, default=True)
    profile_updated = Column(Boolean, default=False)
    account_balance = Column(Numeric(precision=10, scale=2), default=0.00)
    admin = Column(Boolean, default=False)
    devapp = relationship('DevApp', backref="user", lazy="dynamic")
    projects = relationship('Project', backref="user", lazy="dynamic")
    proposals = relationship('Proposal', backref="user", lazy="dynamic")
    transactions = relationship('Monies', backref="user", lazy="dynamic")

    def __repr__(self):
        return self.email
Run Code Online (Sandbox Code Playgroud)