Commit e3e9ca7a authored by wanli's avatar wanli

打通数据库

parent 580d911d
...@@ -98,7 +98,10 @@ def create_app(config): ...@@ -98,7 +98,10 @@ def create_app(config):
# 自定义abort 400 响应数据格式 # 自定义abort 400 响应数据格式
flask_restful.abort = _custom_abort flask_restful.abort = _custom_abort
# 数据库初始化 # 数据库初始化
# db.app = app
db.init_app(app) db.init_app(app)
# 创建表
db.create_all()
# 注册蓝图 # 注册蓝图
from views import api_v1 from views import api_v1
app.register_blueprint(api_v1, url_prefix='/api/v1') app.register_blueprint(api_v1, url_prefix='/api/v1')
......
...@@ -32,13 +32,15 @@ class ProductionConfig(object): ...@@ -32,13 +32,15 @@ class ProductionConfig(object):
MYSQL_PORT = 3306 MYSQL_PORT = 3306
MYSQL_USER = 'debian-sys-maint' MYSQL_USER = 'debian-sys-maint'
MYSQL_PWD = 'XMigC2B2uugnv18y' MYSQL_PWD = 'XMigC2B2uugnv18y'
SQLALCHEMY_BINDS = "sqlite:////test.db" SQLALCHEMY_BINDS = {
SQLALCHEMY_DATABASE_URI = "sqlite:////test.db" 'app-store': 'sqlite:///../test.db'
}
SQLALCHEMY_DATABASE_URI = 'sqlite:///../test.db'
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.SQLALCHEMY_DATABASE_URI = "sqlite:////test.db" self.SQLALCHEMY_DATABASE_URI = 'sqlite:///../test.db'
class DevelopConfig(object): class DevelopConfig(object):
...@@ -66,15 +68,17 @@ class DevelopConfig(object): ...@@ -66,15 +68,17 @@ class DevelopConfig(object):
MYSQL_PORT = 3306 MYSQL_PORT = 3306
MYSQL_USER = 'debian-sys-maint' MYSQL_USER = 'debian-sys-maint'
MYSQL_PWD = 'XMigC2B2uugnv18y' MYSQL_PWD = 'XMigC2B2uugnv18y'
SQLALCHEMY_BINDS = "sqlite:////test.db" SQLALCHEMY_BINDS = {
SQLALCHEMY_DATABASE_URI = "sqlite:////test.db" 'app-store': 'sqlite:///../test.db'
}
SQLALCHEMY_DATABASE_URI = 'sqlite:///../test.db'
SQLALCHEMY_TRACK_MODIFICATIONS = True SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_ECHO = False SQLALCHEMY_ECHO = False
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.SQLALCHEMY_DATABASE_URI = "sqlite:////test.db" self.SQLALCHEMY_DATABASE_URI = 'sqlite:///../test.db'
if MODE == 'production': if MODE == 'production':
config = ProductionConfig() config = ProductionConfig()
......
...@@ -12,7 +12,7 @@ class AppResource(object): ...@@ -12,7 +12,7 @@ class AppResource(object):
# handle business # handle business
logger.warn(params) logger.warn(params)
filters = [] filters = []
result = AppModel.query.filter(*filters).order_by(AppModel.areaId).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = AppModel.query.filter(*filters).order_by(AppModel.app_name).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return result return result
...@@ -20,7 +20,7 @@ class AppResource(object): ...@@ -20,7 +20,7 @@ class AppResource(object):
# handle business # handle business
logger.warn(params) logger.warn(params)
filters = [] filters = []
result = AppModel.query.filter(*filters).order_by(AppModel.areaId).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = AppModel.query.filter(*filters).order_by(AppModel.app_name).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return result return result
......
from datetime import datetime from datetime import datetime
from application.app import db from application.app import db
from models.area import AreaModel from models.area import AreaModel
from models import engine, BaseModel
from webcreator.log import logger from webcreator.log import logger
from webcreator.response import ResponseCode, response_result from webcreator.response import ResponseCode, response_result
...@@ -10,37 +11,45 @@ class AreaResource(object): ...@@ -10,37 +11,45 @@ class AreaResource(object):
def get(self, params): def get(self, params):
# handle business # handle business
logger.warn("============================>")
logger.warn(params) logger.warn(params)
# filters = [AreaModel.is_delete==False] filters = [AreaModel.is_delete==False]
# result = AreaModel.query.filter(*filters).order_by(AreaModel.areaId).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) logger.warn("/////////////////////////////")
result = [] logger.warn("<<<<<<<<>>>>>>>>")
result = db.session.query(AreaModel).filter().order_by(AreaModel.create_at).all()
logger.warn(result)
logger.warn("|||||||||||||||||||||||||||||")
return params return result
def getList(self, params): def getList(self, params):
# handle business # handle business
logger.warn(params) logger.warn(params)
filters = [] filters = []
# result = AreaModel.query.filter(AreaModel.is_delete==False).order_by(AreaModel.create_at).all()
result = AreaModel.query.filter(*filters).order_by(AreaModel.areaId).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = AreaModel.query.filter(*filters).order_by(AreaModel.areaId).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
logger.warn(result)
logger.warn("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
return result return result
def post(self, params, jwt=None): def post(self, params, jwt=None):
# handle business # handle business
result = AreaModel.query.filter(AreaModel.areaCode == params.get('areaCode')).first() result = AreaModel.query.filter(AreaModel.areaCode == params.get('areaCode')).first()
logger.warn(result)
if result and result.is_delete: if result and result.is_delete:
result.is_delete = False result.is_delete = False
result.update_by = jwt['id'] result.update_by = jwt.get("id", "")
result.update_date = datetime.now() result.update_date = datetime.now()
db.session.commit() db.session.commit()
return response_result(ResponseCode.OK) return (True, None)
elif result and result.is_delete == False: elif result and result.is_delete == False:
return response_result(ResponseCode.EXISTS_ERROR) return (False, "area code exists")
result = AreaModel(**params) result = AreaModel(**params)
db.session.add(result) db.session.add(result)
db.session.commit() db.session.commit()
return response_result(ResponseCode.OK) return (True, None)
def put(self, id, params, jwt=None): def put(self, id, params, jwt=None):
# handle business # handle business
......
...@@ -12,7 +12,7 @@ class LoginResource(object): ...@@ -12,7 +12,7 @@ class LoginResource(object):
# handle business # handle business
logger.warn(params) logger.warn(params)
filters = [] filters = []
result = LoginModel.query.filter(*filters).order_by(LoginModel.areaId).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = LoginModel.query.filter(*filters).order_by(LoginModel.user).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return result return result
...@@ -20,7 +20,7 @@ class LoginResource(object): ...@@ -20,7 +20,7 @@ class LoginResource(object):
# handle business # handle business
logger.warn(params) logger.warn(params)
filters = [] filters = []
result = LoginModel.query.filter(*filters).order_by(LoginModel.areaId).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = LoginModel.query.filter(*filters).order_by(LoginModel.user).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return result return result
......
...@@ -12,7 +12,7 @@ class PackageResource(object): ...@@ -12,7 +12,7 @@ class PackageResource(object):
# handle business # handle business
logger.warn(params) logger.warn(params)
filters = [] filters = []
result = PackageModel.query.filter(*filters).order_by(PackageModel.areaId).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = PackageModel.query.filter(*filters).order_by(PackageModel.app).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return result return result
...@@ -20,7 +20,7 @@ class PackageResource(object): ...@@ -20,7 +20,7 @@ class PackageResource(object):
# handle business # handle business
logger.warn(params) logger.warn(params)
filters = [] filters = []
result = PackageModel.query.filter(*filters).order_by(PackageModel.areaId).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = PackageModel.query.filter(*filters).order_by(PackageModel.app).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return result return result
......
...@@ -12,7 +12,7 @@ class UserResource(object): ...@@ -12,7 +12,7 @@ class UserResource(object):
# handle business # handle business
logger.warn(params) logger.warn(params)
filters = [] filters = []
result = UserModel.query.filter(*filters).order_by(UserModel.areaId).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = UserModel.query.filter(*filters).order_by(UserModel.app_name).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return result return result
...@@ -20,7 +20,7 @@ class UserResource(object): ...@@ -20,7 +20,7 @@ class UserResource(object):
# handle business # handle business
logger.warn(params) logger.warn(params)
filters = [] filters = []
result = UserModel.query.filter(*filters).order_by(UserModel.areaId).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = UserModel.query.filter(*filters).order_by(UserModel.app_name).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return result return result
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declared_attr, declarative_base from sqlalchemy.ext.declarative import declared_attr, declarative_base
class BaseModelMixin(object): class BaseModelMixin(object):
...@@ -26,4 +27,32 @@ class MyMixin(object): ...@@ -26,4 +27,32 @@ class MyMixin(object):
# example: # example:
class MyModel(MyMixin, BaseModel): class MyModel(MyMixin, BaseModel):
name = Column(String(1000)) __tablename__ = 'mymodel'
name = Column(String(20))
fullname = Column(String(32))
password = Column(String(32))
# if __name__ == "__main__":
engine = create_engine('sqlite:///test.db')
BaseModel.metadata.create_all(engine, checkfirst=True)
Session = sessionmaker(bind=engine)
session = Session()
ed_user = MyModel(name='ed', fullname='Ed Jones', password='edspassword')
session.add(ed_user)
session.add_all(
[
MyModel(name='wendy', fullname='Wendy Williams', password='foobar'),
MyModel(name='mary', fullname='Mary Contrary', password='xxg527'),
MyModel(name='fred', fullname='Fred Flinstone', password='blah')
]
)
session.commit()
our_user = session.query(MyModel).filter_by(name='ed').first()
print(our_user)
\ No newline at end of file
...@@ -7,17 +7,17 @@ from marshmallow import Schema, fields, INCLUDE, EXCLUDE ...@@ -7,17 +7,17 @@ from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class AppModel(PrimaryModel): class AppModel(PrimaryModel):
__tablename__ = 'evm_app' __tablename__ = 'evm_app'
app_name = db.Column(db.String(70), index = True) app_name = db.Column(db.String(70), index = True, nullable = False)
app_icon = db.Column(db.String(200)) app_icon = db.Column(db.String(200), nullable = False)
app_version = db.Column(db.String(20)) app_version = db.Column(db.String(20), nullable = False)
category = db.Column(db.Integer) category = db.Column(db.Integer, nullable = False)
category_2th = db.Column(db.Integer) category_2th = db.Column(db.Integer, nullable = False)
developer = db.Column(db.Integer) developer = db.Column(db.Integer, nullable = False)
download_url = db.Column(db.String(20)) download_url = db.Column(db.String(20), nullable = False)
app_file_size = db.Column(db.Integer) app_file_size = db.Column(db.Integer, nullable = False)
app_screen_size = db.Column(db.Integer) app_screen_size = db.Column(db.Integer, nullable = False)
app_arch = db.Column(db.String(20)) app_arch = db.Column(db.String(20), nullable = False)
app_review = db.Column(db.String(100)) app_review = db.Column(db.String(100), nullable = False)
# __table_args__ = ( # __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'), # db.Index('idx_xxx', 'xxx', mysql_using='btree'),
......
...@@ -7,13 +7,13 @@ from marshmallow import Schema, fields, INCLUDE, EXCLUDE ...@@ -7,13 +7,13 @@ from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class AreaModel(PrimaryModel): class AreaModel(PrimaryModel):
__tablename__ = 'evm_area' __tablename__ = 'evm_area'
areaCode = db.Column(db.String(20), index = True) areaCode = db.Column(db.String(20), index = True, nullable = False)
areaName = db.Column(db.String(20), index = True) areaName = db.Column(db.String(20), index = True, nullable = False)
level = db.Column(db.Integer, default = 1) level = db.Column(db.Integer, nullable = False, default = 1)
cityCode = db.Column(db.Integer) cityCode = db.Column(db.Integer, nullable = True)
center = db.Column(db.String(20), index = True) center = db.Column(db.String(20), index = True, nullable = False)
parentId = db.Column(db.String(20)) parentId = db.Column(db.String(20), nullable = True)
hasChildren = db.Column(db.Boolean) hasChildren = db.Column(db.Boolean, nullable = True)
# __table_args__ = ( # __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'), # db.Index('idx_xxx', 'xxx', mysql_using='btree'),
...@@ -52,6 +52,8 @@ class PostAreaSchema(ma.SQLAlchemySchema): ...@@ -52,6 +52,8 @@ class PostAreaSchema(ma.SQLAlchemySchema):
areaCode = ma.auto_field() areaCode = ma.auto_field()
areaName = ma.auto_field() areaName = ma.auto_field()
level = ma.auto_field() level = ma.auto_field()
parentId = ma.auto_field()
hasChildren = ma.auto_field()
cityCode = ma.auto_field() cityCode = ma.auto_field()
center = ma.auto_field() center = ma.auto_field()
......
...@@ -4,6 +4,9 @@ import uuid ...@@ -4,6 +4,9 @@ import uuid
from datetime import datetime from datetime import datetime
from application.app import db from application.app import db
def generate_uuid():
return uuid.uuid1().hex
class BaseModel(db.Model): class BaseModel(db.Model):
# Flask-SQLAlchemy创建table时,如何声明基类(这个类不会创建表,可以被继承) # Flask-SQLAlchemy创建table时,如何声明基类(这个类不会创建表,可以被继承)
# 方法就是把__abstract__这个属性设置为True,这个类为基类,不会被创建为表! # 方法就是把__abstract__这个属性设置为True,这个类为基类,不会被创建为表!
...@@ -18,7 +21,7 @@ class BaseModel(db.Model): ...@@ -18,7 +21,7 @@ class BaseModel(db.Model):
class PrimaryModel(BaseModel): class PrimaryModel(BaseModel):
__abstract__ = True __abstract__ = True
id = db.Column(db.Integer, primary_key=True, autoincrement=True) id = db.Column(db.Integer, primary_key=True, autoincrement=True)
uuid = db.Column(db.String(64), primary_key=True, default=uuid.uuid1) uuid = db.Column(db.String(64), primary_key=False, default=generate_uuid)
class AutoBaseModel(BaseModel): class AutoBaseModel(BaseModel):
__abstract__ = True __abstract__ = True
...@@ -27,7 +30,7 @@ class AutoBaseModel(BaseModel): ...@@ -27,7 +30,7 @@ class AutoBaseModel(BaseModel):
class UuidBaseModel(BaseModel): class UuidBaseModel(BaseModel):
__abstract__ = True __abstract__ = True
id = db.Column(db.String(64), primary_key=True, default=uuid.uuid1) id = db.Column(db.String(64), primary_key=True, default=generate_uuid)
sort = db.Column(db.Integer, default=0) sort = db.Column(db.Integer, default=0)
class SortBaseModel(BaseModel): class SortBaseModel(BaseModel):
......
...@@ -7,12 +7,12 @@ from marshmallow import Schema, fields, INCLUDE, EXCLUDE ...@@ -7,12 +7,12 @@ from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class LoginModel(PrimaryModel): class LoginModel(PrimaryModel):
__tablename__ = 'evm_login' __tablename__ = 'evm_login'
user = db.Column(db.Integer) user = db.Column(db.Integer, nullable = False)
login_at = db.Column(db.String(200)) login_at = db.Column(db.String(200), nullable = False)
user_agent = db.Column(db.String(200)) user_agent = db.Column(db.String(200), nullable = False)
ip = db.Column(db.String(128)) ip = db.Column(db.String(128), nullable = False)
geo_location = db.Column(db.String(200)) geo_location = db.Column(db.String(200), nullable = False)
operator = db.Column(db.String(50)) operator = db.Column(db.String(50), nullable = False)
# __table_args__ = ( # __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'), # db.Index('idx_xxx', 'xxx', mysql_using='btree'),
......
...@@ -7,16 +7,16 @@ from marshmallow import Schema, fields, INCLUDE, EXCLUDE ...@@ -7,16 +7,16 @@ from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class PackageModel(PrimaryModel): class PackageModel(PrimaryModel):
__tablename__ = 'evm_package' __tablename__ = 'evm_package'
app = db.Column(db.Integer) app = db.Column(db.Integer, nullable = False)
app_version = db.Column(db.String(200)) app_version = db.Column(db.String(200), nullable = False)
package_info = db.Column(db.String(20)) package_info = db.Column(db.String(20), nullable = False)
file_path = db.Column(db.String(200)) file_path = db.Column(db.String(200), nullable = False)
source = db.Column(db.Integer) source = db.Column(db.Integer, nullable = False)
user_agent = db.Column(db.String(200)) user_agent = db.Column(db.String(200), nullable = False)
download_url = db.Column(db.String(200)) download_url = db.Column(db.String(200), nullable = False)
ip = db.Column(db.String(128)) ip = db.Column(db.String(128), nullable = False)
geo_location = db.Column(db.String(200)) geo_location = db.Column(db.String(200), nullable = False)
operator = db.Column(db.String(50)) operator = db.Column(db.String(50), nullable = False)
# __table_args__ = ( # __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'), # db.Index('idx_xxx', 'xxx', mysql_using='btree'),
......
...@@ -7,17 +7,17 @@ from marshmallow import Schema, fields, INCLUDE, EXCLUDE ...@@ -7,17 +7,17 @@ from marshmallow import Schema, fields, INCLUDE, EXCLUDE
class UserModel(PrimaryModel): class UserModel(PrimaryModel):
__tablename__ = 'evm_user' __tablename__ = 'evm_user'
app_name = db.Column(db.String(70), index = True) app_name = db.Column(db.String(70), index = True, nullable = False)
app_icon = db.Column(db.String(200)) app_icon = db.Column(db.String(200), nullable = False)
app_version = db.Column(db.String(20)) app_version = db.Column(db.String(20), nullable = False)
category = db.Column(db.Integer) category = db.Column(db.Integer, nullable = False)
category_2th = db.Column(db.Integer) category_2th = db.Column(db.Integer, nullable = False)
developer = db.Column(db.Integer) developer = db.Column(db.Integer, nullable = False)
download_url = db.Column(db.String(20)) download_url = db.Column(db.String(20), nullable = False)
app_file_size = db.Column(db.Integer) app_file_size = db.Column(db.Integer, nullable = False)
app_screen_size = db.Column(db.Integer) app_screen_size = db.Column(db.Integer, nullable = False)
app_arch = db.Column(db.String(20)) app_arch = db.Column(db.String(20), nullable = False)
app_review = db.Column(db.String(100)) app_review = db.Column(db.String(100), nullable = False)
# __table_args__ = ( # __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'), # db.Index('idx_xxx', 'xxx', mysql_using='btree'),
......
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
Base = declarative_base()
print(sqlalchemy.__version__)
# where <path> is relative:
engine = create_engine('sqlite:///test.db')
# Unix/Mac - 4 initial slashes in total
# engine = create_engine('sqlite:////absolute/path/to/foo.db')
# # Windows
# engine = create_engine('sqlite:///C:\\path\\to\\foo.db')
# # Windows alternative using raw string
# engine = create_engine(r'sqlite:///C:\path\to\foo.db')
# 定义映射类User,其继承上一步创建的Base
class User(Base):
# 指定本类映射到users表
__tablename__ = 'users'
# 如果有多个类指向同一张表,那么在后边的类需要把extend_existing设为True,表示在已有列基础上进行扩展
# 或者换句话说,sqlalchemy允许类是表的字集
# __table_args__ = {'extend_existing': True}
# 如果表在同一个数据库服务(datebase)的不同数据库中(schema),可使用schema参数进一步指定数据库
# __table_args__ = {'schema': 'test_database'}
# 各变量名一定要与表的各字段名一样,因为相同的名字是他们之间的唯一关联关系
# 从语法上说,各变量类型和表的类型可以不完全一致,如表字段是String(64),但我就定义成String(32)
# 但为了避免造成不必要的错误,变量的类型和其对应的表的字段的类型还是要相一致
# sqlalchemy强制要求必须要有主键字段不然会报错,如果要映射一张已存在且没有主键的表,那么可行的做法是将所有字段都设为primary_key=True
# 不要看随便将一个非主键字段设为primary_key,然后似乎就没报错就能使用了,sqlalchemy在接收到查询结果后还会自己根据主键进行一次去重
# 指定id映射到id字段; id字段为整型,为主键,自动增长(其实整型主键默认就自动增长)
id = Column(Integer, primary_key=True, autoincrement=True)
# 指定name映射到name字段; name字段为字符串类形,
name = Column(String(20))
fullname = Column(String(32))
password = Column(String(32))
# __repr__方法用于输出该类的对象被print()时输出的字符串,如果不想写可以不写
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (self.name, self.fullname, self.password)
def get_dynamic_table_name_class(table_name):
# 定义一个内部类
class TestModel(Base):
# 给表名赋值
__tablename__ = table_name
__table_args__ = {'extend_existing': True}
username = Column(String(32), primary_key=True)
password = Column(String(32))
# 把动态设置表名的类返回去
return TestModel
# 查看映射对应的表
print(User.__table__)
# 创建数据表。一方面通过engine来连接数据库,另一方面根据哪些类继承了Base来决定创建哪些表
# checkfirst=True,表示创建表前先检查该表是否存在,如同名表已存在则不再创建。其实默认就是True
Base.metadata.create_all(engine, checkfirst=True)
# 上边的写法会在engine对应的数据库中创建所有继承Base的类对应的表,但很多时候很多只是用来则试的或是其他库的
# 此时可以通过tables参数指定方式,指示仅创建哪些表
# Base.metadata.create_all(engine,tables=[Base.metadata.tables['users']],checkfirst=True)
# 在项目中由于model经常在别的文件定义,没主动加载时上边的写法可能写导致报错,可使用下边这种更明确的写法
# User.__table__.create(engine, checkfirst=True)
# 另外我们说这一步的作用是创建表,当我们已经确定表已经在数据库中存在时,我完可以跳过这一步
# 针对已存放有关键数据的表,或大家共用的表,直接不写这创建代码更让人心里踏实
# engine是2.2中创建的连接
Session = sessionmaker(bind=engine)
# 创建Session类实例
session = Session()
if __name__ == "__main__":
# 创建User类实例
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
# 将该实例插入到users表
session.add(ed_user)
# 一次插入多条记录形式
session.add_all(
[
User(name='wendy', fullname='Wendy Williams', password='foobar'),
User(name='mary', fullname='Mary Contrary', password='xxg527'),
User(name='fred', fullname='Fred Flinstone', password='blah')
]
)
# 当前更改只是在session中,需要使用commit确认更改才会写入数据库
session.commit()
our_user = session.query(User).filter_by(name='ed').first()
print(our_user)
\ No newline at end of file
...@@ -23,26 +23,33 @@ class AreaResourceList(Resource): ...@@ -23,26 +23,33 @@ class AreaResourceList(Resource):
json_payload = request.json json_payload = request.json
logger.warn(json_payload) logger.warn(json_payload)
data = getListAreaSchema.load(json_payload) data = getListAreaSchema.load(json_payload)
logger.warn("######################")
result = signalManager.actionGetArea.emit(data) result = signalManager.actionGetArea.emit(data)
logger.warn("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^")
logger.warn(result) logger.warn(result)
json_dumps = result # json_dumps = result
# json_dumps = getListAreaSchema.dump(result) # json_dumps = getListAreaSchema.dump(result)
return json_dumps, 200 # logger.warn(json_dumps)
return response_result(ResponseCode.OK, data=result)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.SERVER_ERROR)
@jwt_required # @jwt_required
def post(self): def post(self):
try: try:
json_payload = request.json json_payload = request.json
data = postAreaSchema.load(json_payload) data = postAreaSchema.load(json_payload)
logger.warn(data)
result = signalManager.actionPostArea.emit(data) result = signalManager.actionPostArea.emit(data)
json_dumps = postAreaSchema.dump(result) if result[0] == False:
return jsonify(json_dumps), 200 return response_result(ResponseCode.REQUEST_ERROR, msg=result[1])
logger.warn(result)
# json_dumps = postAreaSchema.dump(result)
return response_result(ResponseCode.OK)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.SERVER_ERROR)
class AreaResource(Resource): class AreaResource(Resource):
......
...@@ -19,7 +19,7 @@ fh.setLevel(logging.DEBUG) ...@@ -19,7 +19,7 @@ fh.setLevel(logging.DEBUG)
ch = logging.StreamHandler() ch = logging.StreamHandler()
ch.setLevel(logging.WARNING) ch.setLevel(logging.WARNING)
formatter = logging.Formatter('[%(asctime)s][%(levelname)7s] [in %(pathname)s -> %(funcName)s line:%(lineno)s] %(message)s') formatter = logging.Formatter('[%(asctime)s][%(levelname)7s][in %(pathname)s -> %(funcName)s line:%(lineno)s] %(message)s')
fh.setFormatter(formatter) fh.setFormatter(formatter)
ch.setFormatter(formatter) ch.setFormatter(formatter)
......
...@@ -3,9 +3,10 @@ ...@@ -3,9 +3,10 @@
"name": "evm-store", "name": "evm-store",
"host": "127.0.0.1", "host": "127.0.0.1",
"port": 1000, "port": 1000,
"jwtSecret": "", "jwtSecret": "6UdxRgs2hvWpTLmj027d5vt7dXXQX",
"tablePrefix": "evm_", "tablePrefix": "evm_",
"logLevel": "debug", "logLevel": "DEBUG",
"database": "sqlite",
"mysql": { "mysql": {
"host": "127.0.0.1", "host": "127.0.0.1",
"port": 3306, "port": 3306,
...@@ -89,7 +90,7 @@ ...@@ -89,7 +90,7 @@
"default": "", "default": "",
"length": 20, "length": 20,
"index": false, "index": false,
"required": true, "required": false,
"toJson": true "toJson": true
}, },
{ {
...@@ -127,6 +128,20 @@ ...@@ -127,6 +128,20 @@
"default": 1, "default": 1,
"required": false "required": false
}, },
{
"name": "parentId",
"dataType": "String",
"location": "args",
"default": "",
"required": false
},
{
"name": "hasChildren",
"dataType": "Boolean",
"location": "args",
"default": false,
"required": false
},
{ {
"name": "cityCode", "name": "cityCode",
"detaType": "String", "detaType": "String",
......
...@@ -87,6 +87,11 @@ def handleModel(config, application): ...@@ -87,6 +87,11 @@ def handleModel(config, application):
target_file = os.sep.join(["models", "{}.py".format(config.get("name"))]) target_file = os.sep.join(["models", "{}.py".format(config.get("name"))])
handleRender(config, 'model.tpl', target_file, fields=fields, extend=extend, application=application) handleRender(config, 'model.tpl', target_file, fields=fields, extend=extend, application=application)
# 多次复制时,会报文件已存在错误,因此要先删除
target_file = os.sep.join(["models", "base.py"])
if os.path.exists(target_file):
os.remove(target_file)
handleRender(config, 'base.tpl', target_file, application=application)
def handleView(config): def handleView(config):
target_file = os.sep.join(["views", "{}.py".format(config.get("name"))]) target_file = os.sep.join(["views", "{}.py".format(config.get("name"))])
...@@ -119,6 +124,8 @@ def handleRender(result, tpl, target_file, **kwargs): ...@@ -119,6 +124,8 @@ def handleRender(result, tpl, target_file, **kwargs):
if os.path.exists(target_file) and os.stat(target_file).st_size > 0: if os.path.exists(target_file) and os.stat(target_file).st_size > 0:
n, e = os.path.splitext(target_file) n, e = os.path.splitext(target_file)
tmp_file = "{}.{}{}".format(n, time.strftime("%Y%m%d%H%M%S", time.localtime()), e) tmp_file = "{}.{}{}".format(n, time.strftime("%Y%m%d%H%M%S", time.localtime()), e)
if os.path.exists(tmp_file):
os.remove(tmp_file)
os.rename(target_file, tmp_file) os.rename(target_file, tmp_file)
with open(target_file, 'w', encoding='utf-8') as f: with open(target_file, 'w', encoding='utf-8') as f:
......
...@@ -98,7 +98,10 @@ def create_app(config): ...@@ -98,7 +98,10 @@ def create_app(config):
# 自定义abort 400 响应数据格式 # 自定义abort 400 响应数据格式
flask_restful.abort = _custom_abort flask_restful.abort = _custom_abort
# 数据库初始化 # 数据库初始化
# db.app = app
db.init_app(app) db.init_app(app)
# 创建表
db.create_all()
# 注册蓝图 # 注册蓝图
from views import api_v1 from views import api_v1
app.register_blueprint(api_v1, url_prefix='/api/v1') app.register_blueprint(api_v1, url_prefix='/api/v1')
......
...@@ -32,13 +32,15 @@ class ProductionConfig(object): ...@@ -32,13 +32,15 @@ class ProductionConfig(object):
MYSQL_PORT = 3306 MYSQL_PORT = 3306
MYSQL_USER = 'debian-sys-maint' MYSQL_USER = 'debian-sys-maint'
MYSQL_PWD = 'XMigC2B2uugnv18y' MYSQL_PWD = 'XMigC2B2uugnv18y'
SQLALCHEMY_BINDS = "sqlite:////test.db" SQLALCHEMY_BINDS = {
SQLALCHEMY_DATABASE_URI = "sqlite:////test.db" 'app-store': 'sqlite:///../test.db'
}
SQLALCHEMY_DATABASE_URI = 'sqlite:///../test.db'
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.SQLALCHEMY_DATABASE_URI = "sqlite:////test.db" self.SQLALCHEMY_DATABASE_URI = 'sqlite:///../test.db'
class DevelopConfig(object): class DevelopConfig(object):
...@@ -66,15 +68,17 @@ class DevelopConfig(object): ...@@ -66,15 +68,17 @@ class DevelopConfig(object):
MYSQL_PORT = 3306 MYSQL_PORT = 3306
MYSQL_USER = 'debian-sys-maint' MYSQL_USER = 'debian-sys-maint'
MYSQL_PWD = 'XMigC2B2uugnv18y' MYSQL_PWD = 'XMigC2B2uugnv18y'
SQLALCHEMY_BINDS = "sqlite:////test.db" SQLALCHEMY_BINDS = {
SQLALCHEMY_DATABASE_URI = "sqlite:////test.db" 'app-store': 'sqlite:///../test.db'
}
SQLALCHEMY_DATABASE_URI = 'sqlite:///../test.db'
SQLALCHEMY_TRACK_MODIFICATIONS = True SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_ECHO = False SQLALCHEMY_ECHO = False
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.SQLALCHEMY_DATABASE_URI = "sqlite:////test.db" self.SQLALCHEMY_DATABASE_URI = 'sqlite:///../test.db'
if MODE == 'production': if MODE == 'production':
config = ProductionConfig() config = ProductionConfig()
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declared_attr, declarative_base from sqlalchemy.ext.declarative import declared_attr, declarative_base
class BaseModelMixin(object): class BaseModelMixin(object):
...@@ -26,4 +27,32 @@ class MyMixin(object): ...@@ -26,4 +27,32 @@ class MyMixin(object):
# example: # example:
class MyModel(MyMixin, BaseModel): class MyModel(MyMixin, BaseModel):
name = Column(String(1000)) __tablename__ = 'mymodel'
name = Column(String(20))
fullname = Column(String(32))
password = Column(String(32))
# if __name__ == "__main__":
engine = create_engine('sqlite:///test.db')
BaseModel.metadata.create_all(engine, checkfirst=True)
Session = sessionmaker(bind=engine)
session = Session()
ed_user = MyModel(name='ed', fullname='Ed Jones', password='edspassword')
session.add(ed_user)
session.add_all(
[
MyModel(name='wendy', fullname='Wendy Williams', password='foobar'),
MyModel(name='mary', fullname='Mary Contrary', password='xxg527'),
MyModel(name='fred', fullname='Fred Flinstone', password='blah')
]
)
session.commit()
our_user = session.query(MyModel).filter_by(name='ed').first()
print(our_user)
\ No newline at end of file
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
Base = declarative_base()
print(sqlalchemy.__version__)
# where <path> is relative:
engine = create_engine('sqlite:///test.db')
# Unix/Mac - 4 initial slashes in total
# engine = create_engine('sqlite:////absolute/path/to/foo.db')
# # Windows
# engine = create_engine('sqlite:///C:\\path\\to\\foo.db')
# # Windows alternative using raw string
# engine = create_engine(r'sqlite:///C:\path\to\foo.db')
# 定义映射类User,其继承上一步创建的Base
class User(Base):
# 指定本类映射到users表
__tablename__ = 'users'
# 如果有多个类指向同一张表,那么在后边的类需要把extend_existing设为True,表示在已有列基础上进行扩展
# 或者换句话说,sqlalchemy允许类是表的字集
# __table_args__ = {'extend_existing': True}
# 如果表在同一个数据库服务(datebase)的不同数据库中(schema),可使用schema参数进一步指定数据库
# __table_args__ = {'schema': 'test_database'}
# 各变量名一定要与表的各字段名一样,因为相同的名字是他们之间的唯一关联关系
# 从语法上说,各变量类型和表的类型可以不完全一致,如表字段是String(64),但我就定义成String(32)
# 但为了避免造成不必要的错误,变量的类型和其对应的表的字段的类型还是要相一致
# sqlalchemy强制要求必须要有主键字段不然会报错,如果要映射一张已存在且没有主键的表,那么可行的做法是将所有字段都设为primary_key=True
# 不要看随便将一个非主键字段设为primary_key,然后似乎就没报错就能使用了,sqlalchemy在接收到查询结果后还会自己根据主键进行一次去重
# 指定id映射到id字段; id字段为整型,为主键,自动增长(其实整型主键默认就自动增长)
id = Column(Integer, primary_key=True, autoincrement=True)
# 指定name映射到name字段; name字段为字符串类形,
name = Column(String(20))
fullname = Column(String(32))
password = Column(String(32))
# __repr__方法用于输出该类的对象被print()时输出的字符串,如果不想写可以不写
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (self.name, self.fullname, self.password)
def get_dynamic_table_name_class(table_name):
# 定义一个内部类
class TestModel(Base):
# 给表名赋值
__tablename__ = table_name
__table_args__ = {'extend_existing': True}
username = Column(String(32), primary_key=True)
password = Column(String(32))
# 把动态设置表名的类返回去
return TestModel
# 查看映射对应的表
print(User.__table__)
# 创建数据表。一方面通过engine来连接数据库,另一方面根据哪些类继承了Base来决定创建哪些表
# checkfirst=True,表示创建表前先检查该表是否存在,如同名表已存在则不再创建。其实默认就是True
Base.metadata.create_all(engine, checkfirst=True)
# 上边的写法会在engine对应的数据库中创建所有继承Base的类对应的表,但很多时候很多只是用来则试的或是其他库的
# 此时可以通过tables参数指定方式,指示仅创建哪些表
# Base.metadata.create_all(engine,tables=[Base.metadata.tables['users']],checkfirst=True)
# 在项目中由于model经常在别的文件定义,没主动加载时上边的写法可能写导致报错,可使用下边这种更明确的写法
# User.__table__.create(engine, checkfirst=True)
# 另外我们说这一步的作用是创建表,当我们已经确定表已经在数据库中存在时,我完可以跳过这一步
# 针对已存放有关键数据的表,或大家共用的表,直接不写这创建代码更让人心里踏实
# engine是2.2中创建的连接
Session = sessionmaker(bind=engine)
# 创建Session类实例
session = Session()
if __name__ == "__main__":
# 创建User类实例
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
# 将该实例插入到users表
session.add(ed_user)
# 一次插入多条记录形式
session.add_all(
[
User(name='wendy', fullname='Wendy Williams', password='foobar'),
User(name='mary', fullname='Mary Contrary', password='xxg527'),
User(name='fred', fullname='Fred Flinstone', password='blah')
]
)
# 当前更改只是在session中,需要使用commit确认更改才会写入数据库
session.commit()
our_user = session.query(User).filter_by(name='ed').first()
print(our_user)
\ No newline at end of file
...@@ -19,7 +19,7 @@ fh.setLevel(logging.DEBUG) ...@@ -19,7 +19,7 @@ fh.setLevel(logging.DEBUG)
ch = logging.StreamHandler() ch = logging.StreamHandler()
ch.setLevel(logging.WARNING) ch.setLevel(logging.WARNING)
formatter = logging.Formatter('[%(asctime)s][%(levelname)7s] [in %(pathname)s -> %(funcName)s line:%(lineno)s] %(message)s') formatter = logging.Formatter('[%(asctime)s][%(levelname)7s][in %(pathname)s -> %(funcName)s line:%(lineno)s] %(message)s')
fh.setFormatter(formatter) fh.setFormatter(formatter)
ch.setFormatter(formatter) ch.setFormatter(formatter)
......
...@@ -4,6 +4,9 @@ import uuid ...@@ -4,6 +4,9 @@ import uuid
from datetime import datetime from datetime import datetime
from application.app import db from application.app import db
def generate_uuid():
return uuid.uuid1().hex
class BaseModel(db.Model): class BaseModel(db.Model):
# Flask-SQLAlchemy创建table时,如何声明基类(这个类不会创建表,可以被继承) # Flask-SQLAlchemy创建table时,如何声明基类(这个类不会创建表,可以被继承)
# 方法就是把__abstract__这个属性设置为True,这个类为基类,不会被创建为表! # 方法就是把__abstract__这个属性设置为True,这个类为基类,不会被创建为表!
...@@ -17,17 +20,17 @@ class BaseModel(db.Model): ...@@ -17,17 +20,17 @@ class BaseModel(db.Model):
class PrimaryModel(BaseModel): class PrimaryModel(BaseModel):
__abstract__ = True __abstract__ = True
id = db.Column(db.Integer, primary_key=True, autoincrement=True) id = db.Column(db.Integer, primary_key=True{% if application.get("database") == "mysql" or application.get("database") == "sqlite" %}, autoincrement=True{% else %}, autoincrement=False{% endif %})
uuid = db.Column(db.String(64), primary_key=True, default=uuid.uuid1) uuid = db.Column(db.String(64), primary_key=False, default=generate_uuid)
class AutoBaseModel(BaseModel): class AutoBaseModel(BaseModel):
__abstract__ = True __abstract__ = True
id = db.Column(db.Integer, primary_key=True, autoincrement=True) id = db.Column(db.Integer, primary_key=True{% if application.get("database") == "mysql" or application.get("database") == "sqlite" %}, autoincrement=True{% else %}, autoincrement=False{% endif %})
sort = db.Column(db.Integer, default=0) sort = db.Column(db.Integer, default=0)
class UuidBaseModel(BaseModel): class UuidBaseModel(BaseModel):
__abstract__ = True __abstract__ = True
id = db.Column(db.String(64), primary_key=True, default=uuid.uuid1) id = db.Column(db.String(64), primary_key=True, default=generate_uuid)
sort = db.Column(db.Integer, default=0) sort = db.Column(db.Integer, default=0)
class SortBaseModel(BaseModel): class SortBaseModel(BaseModel):
......
...@@ -12,7 +12,7 @@ class {{ config['name'] | letterUpper }}Resource(object): ...@@ -12,7 +12,7 @@ class {{ config['name'] | letterUpper }}Resource(object):
# handle business # handle business
logger.warn(params) logger.warn(params)
filters = [] filters = []
result = {{ config['name'] | letterUpper }}Model.query.filter(*filters).order_by({{ config['name'] | letterUpper }}Model.areaId).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = {{ config['name'] | letterUpper }}Model.query.filter(*filters).order_by({{ config['name'] | letterUpper }}Model.{{ config["model"]["fields"][0]["name"] }}).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return result return result
...@@ -20,7 +20,7 @@ class {{ config['name'] | letterUpper }}Resource(object): ...@@ -20,7 +20,7 @@ class {{ config['name'] | letterUpper }}Resource(object):
# handle business # handle business
logger.warn(params) logger.warn(params)
filters = [] filters = []
result = {{ config['name'] | letterUpper }}Model.query.filter(*filters).order_by({{ config['name'] | letterUpper }}Model.areaId).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = {{ config['name'] | letterUpper }}Model.query.filter(*filters).order_by({{ config['name'] | letterUpper }}Model.{{ config["model"]["fields"][0]["name"] }}).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return result return result
...@@ -32,14 +32,14 @@ class {{ config['name'] | letterUpper }}Resource(object): ...@@ -32,14 +32,14 @@ class {{ config['name'] | letterUpper }}Resource(object):
result.update_by = jwt['id'] result.update_by = jwt['id']
result.update_date = datetime.now() result.update_date = datetime.now()
db.session.commit() db.session.commit()
return response_result(ResponseCode.OK) return (True, None)
elif result and result.is_delete == False: elif result and result.is_delete == False:
return response_result(ResponseCode.EXISTS_ERROR) return (False, "exists")
result = {{ config['name'] | letterUpper }}Model(**params) result = {{ config['name'] | letterUpper }}Model(**params)
db.session.add(result) db.session.add(result)
db.session.commit() db.session.commit()
return response_result(ResponseCode.OK) return (True, None)
def put(self, id, params, jwt=None): def put(self, id, params, jwt=None):
# handle business # handle business
......
...@@ -10,11 +10,11 @@ class {{ config['name'] | letterUpper }}Model(PrimaryModel): ...@@ -10,11 +10,11 @@ class {{ config['name'] | letterUpper }}Model(PrimaryModel):
__tablename__ = '{{ application["tablePrefix"] }}{{ config['name'] }}' __tablename__ = '{{ application["tablePrefix"] }}{{ config['name'] }}'
{% for value in config['model']['fields'] %} {% for value in config['model']['fields'] %}
{%- if value.get('primaryKey', None) %} {%- if value.get('primaryKey', None) %}
{{ value.get('name') }} = db.Column(db.{{ value.get('dataType') }}, primary_key = True, {% if value.get('autoIncrement') %}autoincrement = True{% endif %}) {{ value.get('name') }} = db.Column(db.{{ value.get('dataType') }}, primary_key = True)
{%- elif value.get('dataType') == "Int" or value.get('dataType') == "Integer" %} {%- elif value.get('dataType') == "Int" or value.get('dataType') == "Integer" %}
{{ value.get('name') }} = db.Column(db.{{ value.get('dataType') }}{% if value.get("length", None) %}{% endif %}{% if value.get("index", False) %}, index = True{% endif %}{% if value.get("default", None) %}, default = {{value.get("default")}}{% endif %}) {{ value.get('name') }} = db.Column(db.{{ value.get('dataType') }}{% if value.get("length", None) %}{% endif %}{% if value.get("index", False) %}, index = True{% endif %}{% if value.get("required", False) %}, nullable = False{% else %}, nullable = True{% endif %}{% if value.get("default", None) %}, default = {{value.get("default")}}{% endif %})
{%- else %} {%- else %}
{{ value.get('name') }} = db.Column(db.{{ value.get('dataType') }}{% if value.get("length", None) %}({{value.get("length")}}){% endif %}{% if value.get("index", False) %}, index = True{% endif %}{% if value.get("default", None) %}, default = {{value.get("default")}}{% endif %}) {{ value.get('name') }} = db.Column(db.{{ value.get('dataType') }}{% if value.get("length", None) %}({{value.get("length")}}){% endif %}{% if value.get("index", False) %}, index = True{% endif %}{% if value.get("required", False) %}, nullable = False{% else %}, nullable = True{% endif %}{% if value.get("default", None) %}, default = {{value.get("default")}}{% endif %})
{%- endif %} {%- endif %}
{%- endfor %} {%- endfor %}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment