Python 如何使用flask_sqlalchemy定义'ENUM'字段?
这是我的密码:Python 如何使用flask_sqlalchemy定义'ENUM'字段?,python,mysql,flask,Python,Mysql,Flask,这是我的密码: from flask import Flask from flask_sqlalchemy import SQLAlchemy import enum app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root1234@localhost/kaka_db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True db = SQLAlc
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import enum
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root1234@localhost/kaka_db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True
db = SQLAlchemy(app)
class UserType(enum.Enum):
puTongUser = 0
guanLiYuan = 1
superGuanLiYuan = 2
changJia = 3
class User(db.Model):
__talbename__ = 'user_table'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
userName = db.Column(db.String(80), unique=True, nullable=False)
passWord = db.Column(db.String(80), nullable=False)
phone = db.Column(db.String(80))
email = db.Column(db.String(80), unique=True)
userType = db.Column(db.Enum(UserType))
code = db.Column(db.String(80), unique=True)
pushToken = db.Column(db.String(80))
token = db.Column(db.String(80))
regiserType = db.Column(db.Integer, unique=True)
userMoney = db.Column(db.Float)
def __init__(self, username, password, phone = None, email = None, code = None, pushToken = None, userType = 0, registerType = 0, userMoney = 0.0):
self.userName = username
self.passWord = password
self.phone = phone
self.email = email
self.code = code
self.pushToken = pushToken
self.userType = userType
self.regiserType = registerType
self.userMoney = userMoney
db.create_all()
db.session.commit()
if __name__ == '__main__':
app.run(debug = True)
运行时遇到以下错误:
Traceback (most recent call last):
File "C:\Users\elqstux\workspace\Kaka\server.py", line 41, in <module>
db.create_all()
File "C:\Python27\lib\site-packages\flask_sqlalchemy\__init__.py", line 972, in create_all
self._execute_for_all_tables(app, bind, 'create_all')
File "C:\Python27\lib\site-packages\flask_sqlalchemy\__init__.py", line 964, in _execute_for_all_tables
op(bind=self.get_engine(app, bind), **extra)
File "C:\Python27\lib\site-packages\sqlalchemy\sql\schema.py", line 3745, in create_all
tables=tables)
File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 1856, in _run_visitor
conn._run_visitor(visitorcallable, element, **kwargs)
File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 1481, in _run_visitor
**kwargs).traverse_single(element)
File "C:\Python27\lib\site-packages\sqlalchemy\sql\visitors.py", line 121, in traverse_single
return meth(obj, **kw)
File "C:\Python27\lib\site-packages\sqlalchemy\sql\ddl.py", line 720, in visit_metadata
_ddl_runner=self)
File "C:\Python27\lib\site-packages\sqlalchemy\event\attr.py", line 256, in __call__
fn(*args, **kw)
File "C:\Python27\lib\site-packages\sqlalchemy\util\langhelpers.py", line 546, in __call__
return getattr(self.target, self.name)(*arg, **kw)
File "C:\Python27\lib\site-packages\sqlalchemy\sql\sqltypes.py", line 1038, in _on_metadata_create
t = self.dialect_impl(bind.dialect)
File "C:\Python27\lib\site-packages\sqlalchemy\sql\type_api.py", line 361, in dialect_impl
return self._dialect_info(dialect)['impl']
File "C:\Python27\lib\site-packages\sqlalchemy\sql\type_api.py", line 403, in _dialect_info
impl = self._gen_dialect_impl(dialect)
File "C:\Python27\lib\site-packages\sqlalchemy\sql\type_api.py", line 412, in _gen_dialect_impl
return dialect.type_descriptor(self)
File "C:\Python27\lib\site-packages\sqlalchemy\engine\default.py", line 359, in type_descriptor
return sqltypes.adapt_type(typeobj, self.colspecs)
File "C:\Python27\lib\site-packages\sqlalchemy\sql\type_api.py", line 1186, in adapt_type
return typeobj.adapt(impltype)
File "C:\Python27\lib\site-packages\sqlalchemy\sql\sqltypes.py", line 1181, in adapt
**kw)
File "C:\Python27\lib\site-packages\sqlalchemy\dialects\mysql\base.py", line 1486, in __init__
values, length = self._init_values(enums, kw)
File "C:\Python27\lib\site-packages\sqlalchemy\dialects\mysql\base.py", line 1401, in _init_values
q = e[0]
File "C:\Python27\lib\site-packages\enum\__init__.py", line 393, in __getitem__
return cls._member_map_[name]
KeyError: 0
回溯(最近一次呼叫最后一次):
文件“C:\Users\elqstux\workspace\Kaka\server.py”,第41行,在
db.create_all()
文件“C:\Python27\lib\site packages\flask\u sqlalchemy\\uuuu init\uuuu.py”,第972行,在create\u all中
self.\u为所有表执行(应用程序、绑定、“创建所有表”)
文件“C:\Python27\lib\site packages\flask\u sqlalchemy\\uuuuu init\uuuuuuuuu.py”,第964行,在所有表的执行中
op(绑定=自身获取引擎(应用,绑定),**额外)
文件“C:\Python27\lib\site packages\sqlalchemy\sql\schema.py”,第3745行,在create\u all中
表=表)
文件“C:\Python27\lib\site packages\sqlalchemy\engine\base.py”,第1856行,在\u run\u visitor中
连接运行访问者(访问者可调用,元素,**kwargs)
文件“C:\Python27\lib\site packages\sqlalchemy\engine\base.py”,第1481行,在\u run\u visitor中
**kwargs)。单导线(元件)
文件“C:\Python27\lib\site packages\sqlalchemy\sql\visitors.py”,第121行,在traverse\u single中
返回方法(obj,**kw)
文件“C:\Python27\lib\site packages\sqlalchemy\sql\ddl.py”,第720行,在visit\U元数据中
_ddl_runner=self)
文件“C:\Python27\lib\site packages\sqlalchemy\event\attr.py”,第256行,在调用中__
fn(*参数,**千瓦)
文件“C:\Python27\lib\site packages\sqlalchemy\util\langhelpers.py”,第546行,在调用中__
返回getattr(self.target,self.name)(*arg,**kw)
文件“C:\Python27\lib\site packages\sqlalchemy\sql\sqltypes.py”,第1038行,位于元数据创建中
t=自身方言\u impl(绑定方言)
文件“C:\Python27\lib\site packages\sqlalchemy\sql\type\u api.py”,第361行,方言\u impl
返回自我。方言信息(方言)['impl']
文件“C:\Python27\lib\site packages\sqlalchemy\sql\type\u api.py”,第403行,在\u方言\u信息中
impl=self.\u gen\u方言\u impl(方言)
文件“C:\Python27\lib\site packages\sqlalchemy\sql\type\u api.py”,第412行,以\u gen\u方言\u impl
返回方言。类型_描述符(self)
文件“C:\Python27\lib\site packages\sqlalchemy\engine\default.py”,第359行,在类型描述符中
返回sqltypes.adapt_类型(typeobj、self.colspecs)
文件“C:\Python27\lib\site packages\sqlalchemy\sql\type\u api.py”,第1186行,采用自适应类型
返回类型对象自适应(impltype)
文件“C:\Python27\lib\site packages\sqlalchemy\sql\sqltypes.py”,第1181行,在adapt中
**千瓦)
文件“C:\Python27\lib\site packages\sqlalchemy\dialogs\mysql\base.py”,第1486行,在\uuu init中__
值,长度=self.\u初始值(枚举,千瓦)
文件“C:\Python27\lib\site packages\sqlalchemy\dialogs\mysql\base.py”,第1401行,在_init_值中
q=e[0]
文件“C:\Python27\lib\site packages\enum\\uuuuu init\uuuuuu.py”,第393行,在\uuuu getitem中__
返回cls.\u成员\u映射\u[名称]
关键错误:0
根据文档,如果在子模型中有重复的属性名称,则属性将有重复的列
例如,如果您这样做模型,它将使用联接继承,因为没有命名冲突,并且SQLAlchemy不必将两列映射到一个属性中:
class Parent(db.Model):
__tablename__ = 'parent'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
type = db.Column(db.String(50))
__mapper_args__ = {
'polymorphic_identity': 'base',
'polymorphic_on': type
}
class Child(Parent):
__tablename__ = 'child'
child_id = db.Column(db.Integer, db.ForeignKey('parent.id'), primary_key=True)
text = db.Column(db.String(50))
__mapper_args__ = {
'polymorphic_identity': 'child',
}
并将此视图用于子模型,以防止“type”字段在窗体中公开
类PolyModel(sqlamodel.ModelView):
排除的列=('type',)
有了具体的继承,它就可以毫无问题地工作了
我可能会考虑如何处理多列ID,但目前无法提供任何估计
希望有帮助。你能试试这个类的UserType(enum.enum):puTongUser=“puTongUser”guanLiYuan=“guanLiYuan”superGuanLiYuan=“superGuanLiYuan”changJia=“changJia”