use*_*818 9 python sqlalchemy flask flask-sqlalchemy
我正在使用Flask作为我的python wsgi服务器,而sqlalchemy使用我的所有数据库访问.
我想我想在我的应用程序中使用Flask-Sqlalchemy扩展,但我不想使用声明性基类(db.Model),相反,我想使用sqlalchemy.ext.declarative中的基类.
这是否会破坏使用扩展程序的全部目的?
我的用例:
我想扩展程序可以帮助我更好地管理会话/引擎,但我想分别处理所有模型.
我实际上不介意使用扩展,但我想编写严格的模型.我正在从一个非烧瓶应用程序移植代码,我会在我去的时候将更改推回到该项目.例如,如果flask-sqlalchemy允许我欺骗表元数据,那么当代码被推回时会导致问题.我的代码中还有一些代码可以进行大量的类型检查(多态身份),我还记得在使用扩展时不建议读取表格上的类型检查.
你可以让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)
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)
| 归档时间: |
|
| 查看次数: |
4802 次 |
| 最近记录: |