Windows下安装superset

安装Anaconda

网上都推荐用虚拟环境,所以安装了Anaconda。
百度Anaconda,下载对应版本,安装。

配置Anaconda下载源

修改用户名文件夹下'.condarc'文件,我习惯用notepad++打开类似文件。
删除所有内容,将以下内容粘贴:

ssl_verify: true
channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
 
show_channel_urls: true

tips:修改包下载源是为了防止创建虚拟环境出错。

环境配置

在环境配置上坑很多,我遇到了各式各样的,幸好有百度。

安装、配置VC++14环境

下载链接:https://pan.baidu.com/s/11gJPbaLjvc6cDMpecI4q2A
提取码:bq0h
安装

配置虚拟环境

一般来讲以上步骤进行过后就可以成功创建虚拟环境了。输入以下命令:

conda create -n superset python=3.7
> conda create -n superset python=3.7
Solving environment: done

## Package Plan ##

  environment location: D:\ProgramData\Anaconda3\envs\superset

  added / updated specs:
    - python=3.7


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    vs2015_runtime-14.0.25420  |                0         2.0 MB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
    certifi-2019.3.9           |           py37_0         149 KB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    openssl-1.1.1b             |       hfa6e2cd_2         4.8 MB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    wheel-0.33.1               |           py37_0          52 KB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    sqlite-3.26.0              |    hfa6e2cd_1001         958 KB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    ca-certificates-2019.3.9   |       hecc5488_0         184 KB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    wincertstore-0.2           |        py37_1002          13 KB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    pip-19.0.3                 |           py37_0         1.8 MB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    setuptools-41.0.0          |           py37_0         644 KB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    python-3.7.3               |       hb12ca83_0        17.8 MB  https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    vc-14                      |                0          703 B  https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
    ------------------------------------------------------------
                                           Total:        28.3 MB

The following NEW packages will be INSTALLED:

    ca-certificates: 2019.3.9-hecc5488_0  https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    certifi:         2019.3.9-py37_0      https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    openssl:         1.1.1b-hfa6e2cd_2    https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    pip:             19.0.3-py37_0        https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    python:          3.7.3-hb12ca83_0     https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    setuptools:      41.0.0-py37_0        https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    sqlite:          3.26.0-hfa6e2cd_1001 https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    vc:              14-0                 https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
    vs2015_runtime:  14.0.25420-0         https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
    wheel:           0.33.1-py37_0        https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    wincertstore:    0.2-py37_1002        https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge

Proceed ([y]/n)? y


Downloading and Extracting Packages
vs2015_runtime-14.0. | 2.0 MB    | ############################################################################ | 100%
certifi-2019.3.9     | 149 KB    | ############################################################################ | 100%
openssl-1.1.1b       | 4.8 MB    | ############################################################################ | 100%
wheel-0.33.1         | 52 KB     | ############################################################################ | 100%
sqlite-3.26.0        | 958 KB    | ############################################################################ | 100%
ca-certificates-2019 | 184 KB    | ############################################################################ | 100%
wincertstore-0.2     | 13 KB     | ############################################################################ | 100%
pip-19.0.3           | 1.8 MB    | ############################################################################ | 100%
setuptools-41.0.0    | 644 KB    | ############################################################################ | 100%
python-3.7.3         | 17.8 MB   | ############################################################################ | 100%
vc-14                | 703 B     | ############################################################################ | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use:
# > activate superset
#
# To deactivate an active environment, use:
# > deactivate
#
# * for power-users using bash, you must source
#

激活虚拟环境

>activate superset
(superset) D:\Program Files (x86)\cmder>

安装、初始化superset

安装superset

>pip install superset -i https://pypi.douban.com/simple
Looking in indexes: https://pypi.douban.com/simple
Collecting superset
Collecting cryptography (from superset)
  Downloading https://pypi.doubanio.com/packages/00/39/088ba8da28dd77582219d4b77263d5aedac37c5c1c31f75859f241b9fcd2/cryptography-2.6.1-cp37-cp37m-win_amd64.whl (1.5MB)
    100% |████████████████████████████████| 1.5MB 4.1MB/s
Collecting colorama==0.3.9 (from superset)
  Using cached https://pypi.doubanio.com/packages/db/c8/7dcf9dbcb22429512708fe3a547f8b6101c0d02137acbd892505aee57adf/colorama-0.3.9-py2.py3-none-any.whl
Collecting flask-compress (from superset)
Collecting geopy (from superset)
  Downloading https://pypi.doubanio.com/packages/75/3e/80bc987e1635ba9e7455b95e233b296c17f3d3bf3d4760fa67cdfc840e84/geopy-1.19.0-py2.py3-none-any.whl (100kB)
    100% |████████████████████████████████| 102kB 3.1MB/s
Collecting simplejson>=3.15.0 (from superset)
Collecting tableschema (from superset)
  Downloading https://pypi.doubanio.com/packages/82/09/b5a0dd6c8d393f2099afeb899579ad87b09ef24bdb8e21440bda9017ad4e/tableschema-1.3.3-py2.py3-none-any.whl (55kB)
    100% |████████████████████████████████| 61kB 4.1MB/s
Collecting sqlalchemy (from superset)
  Downloading https://pypi.doubanio.com/packages/2a/9b/9b8aa2d5dbe2e4052cb4c84b8cf5e31686943f24b0565f436439bdc343b5/SQLAlchemy-1.3.2.tar.gz (5.9MB)
    100% |████████████████████████████████| 5.9MB 12.8MB/s
Collecting markdown>=3.0 (from superset)
  Downloading https://pypi.doubanio.com/packages/f5/e4/d8c18f2555add57ff21bf25af36d827145896a07607486cc79a2aea641af/Markdown-3.1-py2.py3-none-any.whl (87kB)
    100% |████████████████████████████████| 92kB 7.1MB/s
Collecting idna (from superset)
  Downloading https://pypi.doubanio.com/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl (58kB)
    100% |████████████████████████████████| 61kB 2.7MB/s
Collecting pathlib2 (from superset)
  Downloading https://pypi.doubanio.com/packages/2a/46/c696dcf1c7aad917b39b875acdc5451975e3a9b4890dca8329983201c97a/pathlib2-2.3.3-py2.py3-none-any.whl
Collecting pyhive>=0.4.0 (from superset)
Collecting pandas>=0.18.0 (from superset)
  Downloading https://pypi.doubanio.com/packages/61/c7/f943fceb712579bc538700e2c157dc4972e16abfe29bd4969149bad98c74/pandas-0.24.2-cp37-cp37m-win_amd64.whl (9.0MB)
    100% |████████████████████████████████| 9.0MB 9.3MB/s
Collecting click==6.7 (from superset)
  Using cached https://pypi.doubanio.com/packages/34/c1/8806f99713ddb993c5366c362b2f908f18269f8d792aff1abfd700775a77/click-6.7-py2.py3-none-any.whl
Collecting python-dateutil (from superset)
  Downloading https://pypi.doubanio.com/packages/41/17/c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbb/python_dateutil-2.8.0-py2.py3-none-any.whl (226kB)
    100% |████████████████████████████████| 235kB 10.2MB/s
Collecting flask-caching (from superset)
  Downloading https://pypi.doubanio.com/packages/ea/63/54830e532e4fc507360ff88ded0f78e5ca227e2b6ff9b1ae23e4029ba1a2/Flask_Caching-1.7.0-py2.py3-none-any.whl
Collecting humanize (from superset)
Collecting flask-appbuilder>=1.12.1 (from superset)
Collecting unidecode>=0.04.21 (from superset)
  Downloading https://pypi.doubanio.com/packages/31/39/53096f9217b057cb049fe872b7fc7ce799a1a89b76cf917d9639e7a558b5/Unidecode-1.0.23-py2.py3-none-any.whl (237kB)
    100% |████████████████████████████████| 245kB 9.3MB/s
Collecting flask<1.0.0 (from superset)
  Downloading https://pypi.doubanio.com/packages/2e/48/f1936dadac2326b3d73f2fe0a964a87d16be16eb9d7fc56f09c1bea3d17c/Flask-0.12.4-py2.py3-none-any.whl (81kB)
    100% |████████████████████████████████| 81kB 3.9MB/s
Collecting python-geohash (from superset)
  Downloading https://pypi.doubanio.com/packages/9c/e2/1a3507af7c8f91f8a4975d651d4aeb6a846dfdf74713954186ade4205850/python-geohash-0.8.5.tar.gz
Collecting thrift-sasl>=0.2.1 (from superset)
Collecting polyline (from superset)
  Using cached https://pypi.doubanio.com/packages/c1/d0/58a19ca3fbe880145d200518fcd97d176cae07b9677db330f4881954d5f5/polyline-1.3.2-py2.py3-none-any.whl
Collecting contextlib2 (from superset)
  Downloading https://pypi.doubanio.com/packages/a2/71/8273a7eeed0aff6a854237ab5453bc9aa67deb49df4832801c21f0ff3782/contextlib2-0.5.5-py2.py3-none-any.whl
Collecting sqlalchemy-utils (from superset)
Collecting flower (from superset)
Collecting flask-migrate (from superset)
  Downloading https://pypi.doubanio.com/packages/07/6a/53695aab4c7cf7b230e46a5e4f06e0c9719c01a51223590fd75804439a01/Flask_Migrate-2.4.0-py2.py3-none-any.whl
Collecting flask-wtf (from superset)
  Downloading https://pypi.doubanio.com/packages/60/3a/58c629472d10539ae5167dc7c1fecfa95dd7d0b7864623931e3776438a24/Flask_WTF-0.14.2-py2.py3-none-any.whl
Collecting pydruid>=0.4.3 (from superset)
Collecting pyyaml>=3.11 (from superset)
  Downloading https://pypi.doubanio.com/packages/b6/74/c3e15707516f80192059dde32c9d78f00a88c9f3c4d1efd76cbc8d5b0a20/PyYAML-5.1-cp37-cp37m-win_amd64.whl (215kB)
    100% |████████████████████████████████| 225kB 6.4MB/s
Collecting celery>=4.2.0 (from superset)
  Downloading https://pypi.doubanio.com/packages/5c/a1/a3dd9d8bfa09156ec2cba37f90accf35c0f4ecc3980d96cb4fb99e56504b/celery-4.3.0-py2.py3-none-any.whl (413kB)
    100% |████████████████████████████████| 419kB 11.4MB/s
Collecting gunicorn (from superset)
  Downloading https://pypi.doubanio.com/packages/8c/da/b8dd8deb741bff556db53902d4706774c8e1e67265f69528c14c003644e6/gunicorn-19.9.0-py2.py3-none-any.whl (112kB)
    100% |████████████████████████████████| 122kB 10.2MB/s
Collecting thrift>=0.9.3 (from superset)
Collecting botocore<1.8.0,>=1.7.0 (from superset)
  Downloading https://pypi.doubanio.com/packages/78/07/88ef02fca320ff8f61a5c8f46739f72e715f8745c9ddbf59fc5dba43db1a/botocore-1.7.48-py2.py3-none-any.whl (3.7MB)
    100% |████████████████████████████████| 3.7MB 6.0MB/s
Collecting parsedatetime (from superset)
Collecting boto3==1.4.7 (from superset)
  Using cached https://pypi.doubanio.com/packages/e0/7c/ed4ddcaa65dadba5992fba71b0cd221181f189dd87ac975d25d33c190a61/boto3-1.4.7-py2.py3-none-any.whl
Collecting unicodecsv (from superset)
Collecting sqlparse (from superset)
  Downloading https://pypi.doubanio.com/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl
Collecting future<0.17,>=0.16.0 (from superset)
Collecting requests (from superset)
  Downloading https://pypi.doubanio.com/packages/7d/e3/20f3d364d6c8e5d2353c72a67778eb189176f08e873c9900e10c0287b84b/requests-2.21.0-py2.py3-none-any.whl (57kB)
    100% |████████████████████████████████| 61kB 2.2MB/s
Collecting isodate (from superset)
  Downloading https://pypi.doubanio.com/packages/9b/9f/b36f7774ff5ea8e428fdcfc4bb332c39ee5b9362ddd3d40d9516a55221b2/isodate-0.6.0-py2.py3-none-any.whl (45kB)
    100% |████████████████████████████████| 51kB 3.9MB/s
Collecting bleach (from superset)
  Downloading https://pypi.doubanio.com/packages/ab/05/27e1466475e816d3001efb6e0a85a819be17411420494a1e602c36f8299d/bleach-3.1.0-py2.py3-none-any.whl (157kB)
    100% |████████████████████████████████| 163kB 7.9MB/s
Collecting asn1crypto>=0.21.0 (from cryptography->superset)
  Downloading https://pypi.doubanio.com/packages/ea/cd/35485615f45f30a510576f1a56d1e0a7ad7bd8ab5ed7cdc600ef7cd06222/asn1crypto-0.24.0-py2.py3-none-any.whl (101kB)
    100% |████████████████████████████████| 102kB 7.9MB/s
Collecting six>=1.4.1 (from cryptography->superset)
  Downloading https://pypi.doubanio.com/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Collecting cffi!=1.11.3,>=1.8 (from cryptography->superset)
  Downloading https://pypi.doubanio.com/packages/18/dd/3936f31df9d4c6e07d7dbbee2bda3ebde49c20e0ff9364c753601cd4b4bd/cffi-1.12.2-cp37-cp37m-win_amd64.whl (170kB)
    100% |████████████████████████████████| 174kB 7.3MB/s
Collecting geographiclib<2,>=1.49 (from geopy->superset)
Collecting rfc3986<2.0,>=1.1.0 (from tableschema->superset)
  Downloading https://pypi.doubanio.com/packages/e1/59/1d547e9e5e1bf8074951067c3d6b31a2e29fd5b49bd7d32e53ff0da6406c/rfc3986-1.2.0-py2.py3-none-any.whl
Collecting jsonschema<3.0,>=2.5 (from tableschema->superset)
  Downloading https://pypi.doubanio.com/packages/77/de/47e35a97b2b05c2fadbec67d44cfcdcd09b8086951b331d82de90d2912da/jsonschema-2.6.0-py2.py3-none-any.whl
Collecting tabulator<2.0,>=1.3 (from tableschema->superset)
  Downloading https://pypi.doubanio.com/packages/e2/ba/4ddcb032e268553a74e51c3603c60fbc856e3b1e25f43c0df6e4ef1582d8/tabulator-1.19.0-py2.py3-none-any.whl (51kB)
    100% |████████████████████████████████| 61kB 3.6MB/s
Requirement already satisfied: setuptools>=36 in d:\programdata\anaconda3\envs\superset\lib\site-packages (from markdown>=3.0->superset) (41.0.0)
Collecting pytz>=2011k (from pandas>=0.18.0->superset)
  Downloading https://pypi.doubanio.com/packages/61/28/1d3920e4d1d50b19bc5d24398a7cd85cc7b9a75a490570d5a30c57622d34/pytz-2018.9-py2.py3-none-any.whl (510kB)
    100% |████████████████████████████████| 512kB 6.4MB/s
Collecting numpy>=1.12.0 (from pandas>=0.18.0->superset)
  Downloading https://pypi.doubanio.com/packages/3a/3c/515afabfe4f29bfc0a67037efaf518c33d0076b32d22ba865241cee295c4/numpy-1.16.2-cp37-cp37m-win_amd64.whl (11.9MB)
    100% |████████████████████████████████| 11.9MB 6.4MB/s
Collecting Flask-OpenID<2,>=1.2.5 (from flask-appbuilder>=1.12.1->superset)
Collecting PyJWT>=1.7.1 (from flask-appbuilder>=1.12.1->superset)
  Downloading https://pypi.doubanio.com/packages/87/8b/6a9f14b5f781697e51259d81657e6048fd31a113229cf346880bb7545565/PyJWT-1.7.1-py2.py3-none-any.whl
Collecting Flask-Login<0.5,>=0.3 (from flask-appbuilder>=1.12.1->superset)
Collecting Flask-Babel<1,>=0.11.1 (from flask-appbuilder>=1.12.1->superset)
Collecting Flask-SQLAlchemy<3,>=2.3 (from flask-appbuilder>=1.12.1->superset)
  Using cached https://pypi.doubanio.com/packages/a1/44/294fb7f6bf49cc7224417cd0637018db9fee0729b4fe166e43e2bbb1f1c8/Flask_SQLAlchemy-2.3.2-py2.py3-none-any.whl
Collecting itsdangerous>=0.21 (from flask<1.0.0->superset)
  Downloading https://pypi.doubanio.com/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting Jinja2>=2.4 (from flask<1.0.0->superset)
  Downloading https://pypi.doubanio.com/packages/1d/e7/fd8b501e7a6dfe492a433deb7b9d833d39ca74916fa8bc63dd1a4947a671/Jinja2-2.10.1-py2.py3-none-any.whl (124kB)
    100% |████████████████████████████████| 133kB 9.3MB/s
Collecting Werkzeug>=0.7 (from flask<1.0.0->superset)
  Downloading https://pypi.doubanio.com/packages/18/79/84f02539cc181cdbf5ff5a41b9f52cae870b6f632767e43ba6ac70132e92/Werkzeug-0.15.2-py2.py3-none-any.whl (328kB)
    100% |████████████████████████████████| 337kB 6.0MB/s
Collecting pure-sasl>=0.3.0 (from thrift-sasl>=0.2.1->superset)
Collecting babel<3.0.0,>=1.0 (from flower->superset)
  Downloading https://pypi.doubanio.com/packages/b8/ad/c6f60602d3ee3d92fbed87675b6fb6a6f9a38c223343ababdb44ba201f10/Babel-2.6.0-py2.py3-none-any.whl (8.1MB)
    100% |████████████████████████████████| 8.1MB 10.2MB/s
Collecting tornado<6.0.0,>=4.2.0 (from flower->superset)
  Downloading https://pypi.doubanio.com/packages/d7/d5/99aff77c15da335e3dbf30254b304a526494dca8e51b4b47419772e35a4e/tornado-5.1.1-cp37-cp37m-win_amd64.whl (455kB)
    100% |████████████████████████████████| 460kB 9.3MB/s
Collecting alembic>=0.7 (from flask-migrate->superset)
Collecting WTForms (from flask-wtf->superset)
  Downloading https://pypi.doubanio.com/packages/9f/c8/dac5dce9908df1d9d48ec0e26e2a250839fa36ea2c602cc4f85ccfeb5c65/WTForms-2.2.1-py2.py3-none-any.whl (166kB)
    100% |████████████████████████████████| 174kB 6.4MB/s
Collecting billiard<4.0,>=3.6.0 (from celery>=4.2.0->superset)
  Downloading https://pypi.doubanio.com/packages/3c/a0/5a01bed569cf1af8fcdd4294590acb980a2788d1594f4ccd678b6fea8644/billiard-3.6.0.0.tar.gz (151kB)
    100% |████████████████████████████████| 153kB 5.7MB/s
Collecting kombu<5.0,>=4.4.0 (from celery>=4.2.0->superset)
  Downloading https://pypi.doubanio.com/packages/b7/af/1914e93314f1b98756d5c5e366193124a0ffaab0e6d0e51e0f6f65fa851d/kombu-4.5.0-py2.py3-none-any.whl (185kB)
    100% |████████████████████████████████| 194kB 10.2MB/s
Collecting vine>=1.3.0 (from celery>=4.2.0->superset)
  Downloading https://pypi.doubanio.com/packages/7f/60/82c03047396126c8331ceb64da1dc52d4f1317209f32e8fe286d0c07365a/vine-1.3.0-py2.py3-none-any.whl
Collecting jmespath<1.0.0,>=0.7.1 (from botocore<1.8.0,>=1.7.0->superset)
  Downloading https://pypi.doubanio.com/packages/83/94/7179c3832a6d45b266ddb2aac329e101367fbdb11f425f13771d27f225bb/jmespath-0.9.4-py2.py3-none-any.whl
Collecting docutils>=0.10 (from botocore<1.8.0,>=1.7.0->superset)
  Downloading https://pypi.doubanio.com/packages/36/fa/08e9e6e0e3cbd1d362c3bbee8d01d0aedb2155c4ac112b19ef3cae8eed8d/docutils-0.14-py3-none-any.whl (543kB)
    100% |████████████████████████████████| 552kB 6.8MB/s
Collecting s3transfer<0.2.0,>=0.1.10 (from boto3==1.4.7->superset)
  Using cached https://pypi.doubanio.com/packages/d7/14/2a0004d487464d120c9fb85313a75cd3d71a7506955be458eebfe19a6b1d/s3transfer-0.1.13-py2.py3-none-any.whl
Collecting urllib3<1.25,>=1.21.1 (from requests->superset)
  Downloading https://pypi.doubanio.com/packages/62/00/ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/urllib3-1.24.1-py2.py3-none-any.whl (118kB)
    100% |████████████████████████████████| 122kB 7.3MB/s
Requirement already satisfied: certifi>=2017.4.17 in d:\programdata\anaconda3\envs\superset\lib\site-packages (from requests->superset) (2019.3.9)
Collecting chardet<3.1.0,>=3.0.2 (from requests->superset)
  Using cached https://pypi.doubanio.com/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl
Collecting webencodings (from bleach->superset)
  Downloading https://pypi.doubanio.com/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl
Collecting pycparser (from cffi!=1.11.3,>=1.8->cryptography->superset)
Collecting openpyxl<2.5,>=2.4 (from tabulator<2.0,>=1.3->tableschema->superset)
Collecting xlrd<2.0,>=1.0 (from tabulator<2.0,>=1.3->tableschema->superset)
  Downloading https://pypi.doubanio.com/packages/b0/16/63576a1a001752e34bf8ea62e367997530dc553b689356b9879339cf45a4/xlrd-1.2.0-py2.py3-none-any.whl (103kB)
    100% |████████████████████████████████| 112kB 9.3MB/s
Collecting jsonlines<2.0,>=1.1 (from tabulator<2.0,>=1.3->tableschema->superset)
  Downloading https://pypi.doubanio.com/packages/4f/9a/ab96291470e305504aa4b7a2e0ec132e930da89eb3ca7a82fbe03167c131/jsonlines-1.2.0-py2.py3-none-any.whl
Collecting linear-tsv<2.0,>=1.0 (from tabulator<2.0,>=1.3->tableschema->superset)
Collecting ijson<3.0,>=2.0 (from tabulator<2.0,>=1.3->tableschema->superset)
  Using cached https://pypi.doubanio.com/packages/7f/e9/8508c5f4987ba238a2b169e582c1f70a47272b22a2f1fb06b9318201bb9e/ijson-2.3-py2.py3-none-any.whl
Collecting cchardet<3.0,>=1.0 (from tabulator<2.0,>=1.3->tableschema->superset)
  Downloading https://pypi.doubanio.com/packages/71/f8/561914ee99a16a215a7aaa50ae53bf3c04ec40bf074cdda77aebf9861a36/cchardet-2.1.4-cp37-cp37m-win_amd64.whl (92kB)
    100% |████████████████████████████████| 102kB 4.3MB/s
Collecting python3-openid>=2.0 (from Flask-OpenID<2,>=1.2.5->flask-appbuilder>=1.12.1->superset)
  Downloading https://pypi.doubanio.com/packages/bd/de/52c5699f52dcee3037db587196dcaf63ffedf5fbeba3183afe9b21a3a89f/python3_openid-3.1.0-py3-none-any.whl (130kB)
    100% |████████████████████████████████| 133kB 4.9MB/s
Collecting MarkupSafe>=0.23 (from Jinja2>=2.4->flask<1.0.0->superset)
  Downloading https://pypi.doubanio.com/packages/65/c6/2399700d236d1dd681af8aebff1725558cddfd6e43d7a5184a675f4711f5/MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl
Collecting python-editor>=0.3 (from alembic>=0.7->flask-migrate->superset)
  Downloading https://pypi.doubanio.com/packages/c6/d3/201fc3abe391bbae6606e6f1d598c15d367033332bd54352b12f35513717/python_editor-1.0.4-py3-none-any.whl
Collecting Mako (from alembic>=0.7->flask-migrate->superset)
Collecting amqp<3.0,>=2.4.0 (from kombu<5.0,>=4.4.0->celery>=4.2.0->superset)
  Downloading https://pypi.doubanio.com/packages/42/ec/cbbaa8f75be8cbd019afb9d63258e2bdc95242f8c46a54bb90db5fef03bd/amqp-2.4.2-py2.py3-none-any.whl (49kB)
    100% |████████████████████████████████| 51kB 2.4MB/s
Collecting et-xmlfile (from openpyxl<2.5,>=2.4->tabulator<2.0,>=1.3->tableschema->superset)
Collecting jdcal (from openpyxl<2.5,>=2.4->tabulator<2.0,>=1.3->tableschema->superset)
  Downloading https://pypi.doubanio.com/packages/a0/38/dcf83532480f25284f3ef13f8ed63e03c58a65c9d3ba2a6a894ed9497207/jdcal-1.4-py2.py3-none-any.whl
Collecting defusedxml (from python3-openid>=2.0->Flask-OpenID<2,>=1.2.5->flask-appbuilder>=1.12.1->superset)
  Downloading https://pypi.doubanio.com/packages/87/1c/17f3e3935a913dfe2a5ca85fa5ccbef366bfd82eb318b1f75dadbf0affca/defusedxml-0.5.0-py2.py3-none-any.whl
Building wheels for collected packages: sqlalchemy, python-geohash, billiard
  Building wheel for sqlalchemy (setup.py) ... done
  Stored in directory: C:\Users\fanke\AppData\Local\pip\Cache\wheels\fe\56\38\b17bae00bb1bc421538c2c55466cea6b07c9330617c30eaee6
  Building wheel for python-geohash (setup.py) ... done
  Stored in directory: C:\Users\fanke\AppData\Local\pip\Cache\wheels\8e\0d\19\2e054c45396a0f8d90ae1d4a02cb3487ab2cf82a44430ce516
  Building wheel for billiard (setup.py) ... done
  Stored in directory: C:\Users\fanke\AppData\Local\pip\Cache\wheels\d8\e6\de\f371db848ddfeaf654a7efb3b1c92b94c9664284036b774101
Successfully built sqlalchemy python-geohash billiard
Installing collected packages: asn1crypto, six, pycparser, cffi, cryptography, colorama, itsdangerous, MarkupSafe, Jinja2, Werkzeug, click, flask, flask-compress, geographiclib, geopy, simplejson, unicodecsv, rfc3986, python-dateutil, jsonschema, isodate, urllib3, chardet, idna, requests, et-xmlfile, jdcal, openpyxl, xlrd, sqlalchemy, jsonlines, linear-tsv, ijson, cchardet, tabulator, tableschema, markdown, pathlib2, future, pyhive, pytz, numpy, pandas, flask-caching, humanize, defusedxml, python3-openid, Flask-OpenID, PyJWT, WTForms, flask-wtf, Flask-Login, babel, Flask-Babel, Flask-SQLAlchemy, flask-appbuilder, unidecode, python-geohash, thrift, pure-sasl, thrift-sasl, polyline, contextlib2, sqlalchemy-utils, billiard, vine, amqp, kombu, celery, tornado, flower, python-editor, Mako, alembic, flask-migrate, pydruid, pyyaml, gunicorn, jmespath, docutils, botocore, parsedatetime, s3transfer, boto3, sqlparse, webencodings, bleach, superset
Successfully installed Flask-Babel-0.12.2 Flask-Login-0.4.1 Flask-OpenID-1.2.5 Flask-SQLAlchemy-2.3.2 Jinja2-2.10.1 Mako-1.0.8 MarkupSafe-1.1.1 PyJWT-1.7.1 WTForms-2.2.1 Werkzeug-0.15.2 alembic-1.0.8 amqp-2.4.2 asn1crypto-0.24.0 babel-2.6.0 billiard-3.6.0.0 bleach-3.1.0 boto3-1.4.7 botocore-1.7.48 cchardet-2.1.4 celery-4.3.0 cffi-1.12.2 chardet-3.0.4 click-6.7 colorama-0.3.9 contextlib2-0.5.5 cryptography-2.6.1 defusedxml-0.5.0 docutils-0.14 et-xmlfile-1.0.1 flask-0.12.4 flask-appbuilder-1.12.5 flask-caching-1.7.0 flask-compress-1.4.0 flask-migrate-2.4.0 flask-wtf-0.14.2 flower-0.9.3 future-0.16.0 geographiclib-1.49 geopy-1.19.0 gunicorn-19.9.0 humanize-0.5.1 idna-2.8 ijson-2.3 isodate-0.6.0 itsdangerous-1.1.0 jdcal-1.4 jmespath-0.9.4 jsonlines-1.2.0 jsonschema-2.6.0 kombu-4.5.0 linear-tsv-1.1.0 markdown-3.1 numpy-1.16.2 openpyxl-2.4.11 pandas-0.24.2 parsedatetime-2.4 pathlib2-2.3.3 polyline-1.3.2 pure-sasl-0.6.1 pycparser-2.19 pydruid-0.5.2 pyhive-0.6.1 python-dateutil-2.8.0 python-editor-1.0.4 python-geohash-0.8.5 python3-openid-3.1.0 pytz-2018.9 pyyaml-5.1 requests-2.21.0 rfc3986-1.2.0 s3transfer-0.1.13 simplejson-3.16.0 six-1.12.0 sqlalchemy-1.3.2 sqlalchemy-utils-0.33.11 sqlparse-0.3.0 superset-0.28.1 tableschema-1.3.3 tabulator-1.19.0 thrift-0.11.0 thrift-sasl-0.3.0 tornado-5.1.1 unicodecsv-0.14.1 unidecode-1.0.23 urllib3-1.24.1 vine-1.3.0 webencodings-0.5.1 xlrd-1.2.0

初始化superset

官方步骤如下,但是完全扯淡,全是坑。

# 创建管理员账号
fabmanager create-admin --app superset 

# 初始化数据库
superset db upgrade

# 载入案例数据
superset load_examples

# 初始化角色和权限
superset init

# 启动服务,端口号 8088,使用 -p 更改端口号
superset runserver

1.第一步出现的问题

>fabmanager create-admin --app superset
Username [admin]: fankenan
User first name [admin]: fan
User last name [user]: kenan
Email [admin@fab.org]: fankenan@126.com
Password:
Repeat for confirmation:
Was unable to import superset Error: cannot import name '_maybe_box_datetimelike' from 'pandas.core.common' 
(d:\programdata\anaconda3\envs\superset\lib\site-packages\pandas\core\common.py)

解决方法:
找到上面第九行的路径中的文件,搜索'maybe_box_datetimelike',在最前面加上'_',保存后,重新运行命令:

>fabmanager create-admin --app superset
Username [admin]: 1
User first name [admin]: 1
User last name [user]: 1
Email [admin@fab.org]: a@b.com
Password:
Repeat for confirmation:
Recognized Database Authentications.
2019-04-08 22:14:16,437:ERROR:flask_appbuilder.security.sqla.manager:Error adding new user to database. (sqlite3.IntegrityError) UNIQUE constraint failed: ab_user.email
[SQL: INSERT INTO ab_user (first_name, last_name, username, password, active, email, last_login, login_count, fail_login_count, created_on, changed_on, created_by_fk, changed_by_fk) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]
[parameters: ('1', '1', '1', 'pbkdf2:sha256:150000$60Pb5zvk$4c95de37734363679b5b0d74da82765e97bbebf3a2b63c390e45a6beab73f57c', 1, 'a@b.com', None, None, None, '2019-04-08 22:14:16.437471', '2019-04-08 22:14:16.437471', None, None)]
(Background on this error at: http://sqlalche.me/e/gkpj)
No user created an error occured

2.第二步出现的问题:

>superset db upgrade
'superset' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

解决方法:cd到superset的bin目录后运行。

(superset) d:\ProgramData\Anaconda3\envs\superset\Lib\site-packages\superset\bin>

命令前加'python',后几个命令一样。

>python superset db upgrade
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade bddc498dd179 -> 4451805bbaa1, remove double percents
Traceback (most recent call last):
  File "superset", line 15, in <module>
    cli()
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\click\core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\flask\cli.py", line 380, in main
    return AppGroup.main(self, *args, **kwargs)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\click\core.py", line 697, in main
    rv = self.invoke(ctx)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\click\core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\click\core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\click\core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\click\core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\click\decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\flask\cli.py", line 257, in decorator
    return __ctx.invoke(f, *args, **kwargs)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\click\core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\flask_migrate\cli.py", line 134, in upgrade
    _upgrade(directory, revision, sql, tag, x_arg)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\flask_migrate\__init__.py", line 95, in wrapped
    f(*args, **kwargs)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\flask_migrate\__init__.py", line 280, in upgrade
    command.upgrade(config, revision, sql=sql, tag=tag)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\alembic\command.py", line 276, in upgrade
    script.run_env()
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\alembic\script\base.py", line 475, in run_env
    util.load_python_file(self.dir, "env.py")
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\alembic\util\pyfiles.py", line 90, in load_python_file
    module = load_module_py(module_id, path)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\alembic\util\compat.py", line 156, in load_module_py
    spec.loader.exec_module(module)
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\superset/migrations\env.py", line 100, in <module>
    run_migrations_online()
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\superset/migrations\env.py", line 93, in run_migrations_online
    context.run_migrations()
  File "<string>", line 8, in run_migrations
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\alembic\runtime\environment.py", line 839, in run_migrations
    self.get_context().run_migrations(**kw)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\alembic\runtime\migration.py", line 361, in run_migrations
    step.migration_fn(**kw)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\superset\migrations\versions\4451805bbaa1_remove_double_percents.py", line 82, in upgrade
    replace('%%', '%')
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\superset\migrations\versions\4451805bbaa1_remove_double_percents.py", line 53, in replace
    .join(Table)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\sqlalchemy\orm\query.py", line 2235, in join
    from_joinpoint=from_joinpoint,
  File "<string>", line 2, in _join
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\sqlalchemy\orm\base.py", line 220, in generate
    fn(self, *args[1:], **kw)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\sqlalchemy\orm\query.py", line 2414, in _join
    left, right, onclause, prop, create_aliases, outerjoin, full
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\sqlalchemy\orm\query.py", line 2437, in _join_left_to_right
    ) = self._join_determine_implicit_left_side(left, right, onclause)
  File "D:\ProgramData\Anaconda3\envs\superset\lib\site-packages\sqlalchemy\orm\query.py", line 2568, in _join_determine_implicit_left_side
    "Can't determine which FROM clause to join "
sqlalchemy.exc.InvalidRequestError: Can't determine which FROM clause to join from, there are multiple FROMS which can join to this entity. Try adding an explicit ON clause to help resolve the ambiguity.

坑又来了,这里出现了数据库问题,困扰了很长时间。后来发现一个答案很符合,谁用谁说好。
将sqlalchemy版本降级到1.2

>pip uninstall SQLAlchemy
Uninstalling SQLAlchemy-1.3.2:
  Would remove:
    d:\programdata\anaconda3\envs\superset\lib\site-packages\sqlalchemy-1.3.2.dist-info\*
    d:\programdata\anaconda3\envs\superset\lib\site-packages\sqlalchemy\*
Proceed (y/n)? y
  Successfully uninstalled SQLAlchemy-1.3.2
  
>pip install SQLAlchemy==1.2 -i https://pypi.douban.com/simple
Looking in indexes: https://pypi.douban.com/simple
Collecting SQLAlchemy==1.2
  Downloading https://pypi.doubanio.com/packages/be/d1/0008f4ee8d8eaae328efbf9cc513c1bee6f6793de11ab82cb31b3045ee06/SQLAlchemy-1.2.0.tar.gz (5.5MB)
    100% |████████████████████████████████| 5.5MB 6.0MB/s
Building wheels for collected packages: SQLAlchemy
  Building wheel for SQLAlchemy (setup.py) ... done
  Stored in directory: C:\Users\fanke\AppData\Local\pip\Cache\wheels\06\66\0d\469ed25b444a4666f93c1a1d25668c1a3e0709cee72ea355b9
Successfully built SQLAlchemy
Installing collected packages: SQLAlchemy
Successfully installed SQLAlchemy-1.2.0

然后重新初始化数据库。

>python superset db upgrade
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade bddc498dd179 -> 4451805bbaa1, remove double percents
INFO  [alembic.runtime.migration] Running upgrade 4451805bbaa1, 1d9e835a84f9 -> 705732c70154, empty message
INFO  [alembic.runtime.migration] Running upgrade 4451805bbaa1, 1d9e835a84f9 -> fc480c87706c, empty message
INFO  [alembic.runtime.migration] Running upgrade fc480c87706c -> bebcf3fed1fe, Migrate dashboard position_json data from V1 to V2
scanning dashboard (1/4) >>>>
Skip converted dash_id: 1
scanning dashboard (2/4) >>>>
Skip converted dash_id: 2
scanning dashboard (3/4) >>>>
Skip converted dash_id: 3
scanning dashboard (4/4) >>>>
Skip converted dash_id: 4
INFO  [alembic.runtime.migration] Running upgrade bebcf3fed1fe, 705732c70154 -> ec1f88a35cc6, empty message
INFO  [alembic.runtime.migration] Running upgrade 4451805bbaa1, 1d9e835a84f9 -> e3970889f38e, empty message
INFO  [alembic.runtime.migration] Running upgrade 705732c70154, e3970889f38e -> 46ba6aaaac97, empty message
INFO  [alembic.runtime.migration] Running upgrade 46ba6aaaac97, ec1f88a35cc6 -> c18bd4186f15, empty message
INFO  [alembic.runtime.migration] Running upgrade c18bd4186f15 -> 7fcdcde0761c, Reduce position_json size by remove extra space and component id prefix
dash id:1 position_json size from 4931 to 2757
dash id:2 position_json size from 5701 to 3226
dash id:3 position_json size from 4009 to 2285
dash id:4 position_json size from 3016 to 1643
INFO  [alembic.runtime.migration] Running upgrade 7fcdcde0761c -> 0c5070e96b57, add user attributes table
INFO  [alembic.runtime.migration] Running upgrade 0c5070e96b57 -> 1a1d627ebd8e, position_json
INFO  [alembic.runtime.migration] Running upgrade 1a1d627ebd8e -> 55e910a74826, add_metadata_column_to_annotation_model.py

3.前面问题只要解决,后面两个命令一般都没什么问题。
4.启动superset服务,要在最后加'-d'。

>python superset runserver -d
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Starting Superset server in DEBUG mode
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

2019-04-08 22:37:04,969:INFO:werkzeug: * Restarting with stat
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Starting Superset server in DEBUG mode
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

2019-04-08 22:37:08,855:WARNING:werkzeug: * Debugger is active!
2019-04-08 22:37:08,884:INFO:werkzeug: * Debugger PIN: 144-669-782
2019-04-08 22:37:09,803:INFO:werkzeug: * Running on http://0.0.0.0:8088/ (Press CTRL+C to quit)

最后在浏览器输入:http://localhost:8088即可访问。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容