我正在开发一个小型的CRM系统。现在我测试导入时出现了一个错误_数据.py邮递员。我真的不知道如何解决这个问题……我已经测试过将数据手动插入MySQL数据库中,并且成功了。我不确定是哪个部分造成了问题,但我认为问题应该在应用程序副本,或导入_数据.py或者我在邮递员手下的测试方式。这是我项目的结构。在
项目结构
这里是应用程序副本在
# -*- coding:utf-8 -*-
import pandas as pd
from flask import Flask, request
import logging; logging.basicConfig(level=logging.INFO)
import asyncio, os, json, time
from datetime import datetime
from util.template import ReponseTemplate
from aiohttp import web
from api import import_data, statistic, general_search
import sys
import traceback
from werkzeug.utils import secure_filename
# UPLOAD_FOLDER = '/path/to/the/uploads'
ALLOWED_EXTENSIONS = set(['xlsx', 'xls', 'csv'])
app = Flask(__name__)
# app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 60 * 1024 * 1024
app.register_blueprint(import_data.mold, url_prefix='/api/import')
app.register_blueprint(general_search.mold, url_prefix='/api/show')
app.register_blueprint(statistic.mold, url_prefix='/api/check')
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
@app.route('/upload', methods=['POST'])
def upload_excel():
f = request.files['file']
if f and allowed_file(f.filename):
filename = secure_filename(f.filename)
f.save(secure_filename(filename))
# file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
df = pd.read_excel(f)
return ReponseTemplate().jsonify_ok_df_response(df)
@app.errorhandler(Exception)
def default_exception_handler(error):
exc_type, exc_value, exc_traceback = sys.exc_info()
trace = traceback.format_exception(exc_type, exc_value,
exc_traceback)
code = 401 if 'auth' in str(type(error)).lower() else 400
print('[Error]:{}'.format(trace))
return ReponseTemplate().jsonify_bad_response(str(error), code)
if __name__ == '__main__':
app.run(debug=True)
这里是模板.py在
^{pr2}$这是进口_数据.py在
# -*- coding:utf-8 -*-
import json
from flask import Blueprint, request
from util.template import ResponseTemplate
import logging
from model.dbmodel import Customers, Transaction
from sqlalchemy.orm import mapper, sessionmaker
from sqlalchemy import create_engine
import config
import pandas as pd
from sqlalchemy.ext.declarative import declarative_base
mold = Blueprint('import', __name__)
conn = config.conn_str
Base = declarative_base()
@mold.route('/customer', methods=['POST'])
def import_customer():
engine = create_engine(conn)
# df = pd.read_excel(request.data)
cum = json.loads(request.data)
if cum is None:
logging.info("Not able to get the data from request.")
# Customers.name = cum.get('name', '')
# Customers.address = cum.get('address', '')
# Customers.phone = cum.get('phone', '')
# Customers.source_from = cum.get('source_from', '')
name = cum.get('name', '')
address = cum.get('address', '')
phone = cum.get('phone', '')
source_from = cum.get('source_from', '')
Base.metadata.create_all(engine)
Session_class = sessionmaker(bind=engine)
session = Session_class()
# generate the object for the data we would like to insert
customer_obj = Customers(name=name, address=address,
phone=phone, source_from=source_from)
# nothing yet, print to check
print(customer_obj.id, customer_obj.name,
customer_obj.phone, customer_obj.address,
customer_obj.source_from)
session.add(customer_obj) # put the data obj into session, will insert together
# check again. but still nothing yet....
print(customer_obj.id, customer_obj.name,
customer_obj.phone, customer_obj.address,
customer_obj.source_from)
session.commit() # insert the data into database
return ResponseTemplate.jsonify_ok_obj_response(customer_obj)
@mold.route('/transactions/<file_name>', methods=['POST'])
def import_transactions(file_name):
engine = create_engine(conn)
#df = pd.read_excel(request.data)
#tran = json.loads(request.data)
tran = pd.read_excel(file_name)
if tran is None:
logging.info("Not able to get the data from file.")
name = tran.get('name', '')
# print(name)
date = tran.get('date', '')
# print(date)
product = tran.get('product', '')
# print(product)
quantity = tran.get('quantity', '')
amount = tran.get('amount', '')
Base.metadata.create_all(engine)
Session_class = sessionmaker(bind=engine)
session = Session_class()
# generate the object for the data we would like to insert
transaction_obj = Transaction(name=name, date=date, product=product,
quantity=quantity, amount=amount)
# print to check, there should be nothing yet
print(transaction_obj.name, transaction_obj.product, transaction_obj.date,
transaction_obj.quantity, transaction_obj.amount)
session.add(transaction_obj) # put the data into obj
# check again, there should be nothing still
print(transaction_obj.name, transaction_obj.product, transaction_obj.date,
transaction_obj.quantity, transaction_obj.amount)
session.commit() # insert
return ResponseTemplate.jsonify_ok_obj_response(transaction_obj)
以下是数据库中两个表的编码:数据库模型.py在
# -*- coding:utf-8 -*-
from sqlalchemy import Table, MetaData, Column, Integer, String, DATE, DECIMAL, ForeignKey, DateTime
from sqlalchemy.orm import mapper
from sqlalchemy.ext.declarative import declarative_base
#metadata = MetaData()
Base = declarative_base()
# customers = Table('customers', metadata,
# Column('id', Integer, primary_key=True, autoincrement=True),
# Column('name', String(20)),
# Column('phone', String(20)),
# Column('address', String(45)),
# Column('source_from', String(45))
# )
class Customers(Base):
# def __init__(self, id, name, phone, address, source_from):
# self.id = id
# self.name = name
# self.phone = phone
# self.address = address
# self.source_from = source_from
#
# def __repr__(self):
# return "<Customer(name='%s', phone='%s', address='%s', " \
# "source_from='%s')" % (self.name, self.phone, self.address,
# self.source_from)
__tablename__ = 'customers'
id = Column(Integer, primary_key=True, autoincrement=True, nullable=False)
name = Column(String(20))
phone = Column(String(20))
address = Column(String(45))
source_from = Column(String(45))
# mapper(Customers, customers)
# the table metadata is created separately with the Table construct,
# then associated with the User class via the mapper() function
# transaction = Table('transaction', metadata,
# Column('id', Integer, primary_key=True, autoincrement=True),
# Column('name', String(20)),
# Column('date', DateTime),
# Column('product', String(20)),
# Column('quantity', Integer),
# Column('amount', DECIMAL(2))
# )
class Transaction(Base):
# def __init__(self, id, name, date, product, quantity, amount):
# self.id = id
# self.name = name
# self.date = date
# self.product = product
# self.quantity = quantity
# self.amount = amount
#
# def __repr__(self):
# return "<Transaction(name='%s', date='%s', product='%s'," \
# "quantity='%s', amount='%s')>" % (self.name, self.date,
# self.product, self.quantity,
# self.amount)
__tablename__ = 'transaction'
id = Column(Integer, primary_key=True, autoincrement=True, nullable=False)
name = Column(String(20))
date = Column(DATE)
product = Column(String(20))
quantity = Column(Integer)
amount = Column(Integer)
# mapper(Transaction, transaction)
下面的链接是我测试api后的postman结果截图:
邮递员测试结果
以下是我用postman测试api后pycharm发出的错误消息:
> [Error]:['Traceback (most recent call last):\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/flask/app.py", > line 1813, in full_dispatch_request\n rv = > self.dispatch_request()\n', > ' File "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/flask/app.py", > line 1799, in dispatch_request\n return > self.view_functions[rule.endpoint](**req.view_args)\n', ' File > "/Users/chenneyhuang/PycharmProjects/Fruit/api/import_data.py", line > 91, in import_transactions\n session.commit() # insert\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/orm/session.py", > line 943, in commit\n self.transaction.commit()\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/orm/session.py", > line 467, in commit\n self._prepare_impl()\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/orm/session.py", > line 447, in _prepare_impl\n self.session.flush()\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/orm/session.py", > line 2254, in flush\n self._flush(objects)\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/orm/session.py", > line 2380, in _flush\n > transaction.rollback(_capture_exception=True)\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", > line 66, in __exit__\n compat.reraise(exc_type, exc_value, > exc_tb)\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/util/compat.py", > line 249, in reraise\n raise value\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/orm/session.py", > line 2344, in _flush\n flush_context.execute()\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", > line 391, in execute\n rec.execute(self)\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", > line 556, in execute\n uow\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", > line 181, in save_obj\n mapper, table, insert)\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", > line 866, in _emit_insert_statements\n execute(statement, > params)\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/engine/base.py", > line 948, in execute\n return meth(self, multiparams, params)\n', ' > File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", > line 269, in _execute_on_connection\n return > connection._execute_clauseelement(self, multiparams, params)\n', ' > File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/engine/base.py", > line 1060, in _execute_clauseelement\n compiled_sql, > distilled_params\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/engine/base.py", > line 1200, in _execute_context\n context)\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/engine/base.py", > line 1416, in _handle_dbapi_exception\n util.reraise(*exc_info)\n', > ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/util/compat.py", > line 249, in reraise\n raise value\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/engine/base.py", > line 1193, in _execute_context\n context)\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/sqlalchemy/engine/default.py", > line 509, in do_execute\n cursor.execute(statement, parameters)\n', > ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/pymysql/cursors.py", > line 168, in execute\n query = self.mogrify(query, args)\n', ' > File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/pymysql/cursors.py", > line 147, in mogrify\n query = query % self._escape_args(args, > conn)\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/pymysql/cursors.py", > line 127, in _escape_args\n return dict((key, conn.literal(val)) > for (key, val) in args.items())\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/pymysql/cursors.py", > line 127, in <genexpr>\n return dict((key, conn.literal(val)) for > (key, val) in args.items())\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/pymysql/connections.py", > line 469, in literal\n return self.escape(obj, self.encoders)\n', ' > File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/pymysql/connections.py", > line 462, in escape\n return converters.escape_item(obj, > self.charset, mapping=mapping)\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/pymysql/converters.py", > line 27, in escape_item\n val = encoder(val, mapping)\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/pymysql/converters.py", > line 118, in escape_unicode\n return u"\'%s\'" % > _escape_unicode(value)\n', ' File "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/pymysql/converters.py", > line 73, in _escape_unicode\n return > value.translate(_escape_table)\n', ' File > "/Applications/anaconda3/envs/Fruit/lib/python3.6/site-packages/pandas/core/generic.py", > line 4376, in __getattr__\n return object.__getattribute__(self, > name)\n', "AttributeError: 'Series' object has no attribute > 'translate'\n"]
我用的是Python3.6。 以下是套餐详情:
aiohttp==3.3.2
aiomysql==0.0.19
asn1crypto==0.24.0
async-timeout==3.0.0
attrs==18.1.0
cffi==1.11.5
chardet==3.0.4
click==6.7
cryptography==2.2.2
Flask==1.0.2
idna==2.7
idna-ssl==1.1.0
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
multidict==4.3.1
numpy==1.15.0
pandas==0.23.4
pycparser==2.18
PyMySQL==0.9.2
python-dateutil==2.7.3
pytz==2018.5
simplejson==3.16.0
six==1.11.0
SQLAlchemy==1.2.10
Werkzeug==0.14.1
xlrd==1.1.0
yarl==1.2.6
之所以会发生这种情况,是因为您将一个对象从
pandas
传递给了一个需要纯字符串的操作(它恰好是一个Series
对象,如堆栈跟踪所示)。在看看这个序列:
tran
这里不是普通的Pythondict
或{tran[x]
)或{如果您的
^{pr2}$.get('key')
操作从str
类型的数据帧中选择一个值,则需要显式地将其转换为Python字符串,不能只将其提供给一个需要字符串的数据库函数并希望它神奇地变为字符串:我怀疑它实际上会给你一列值,但是-你需要在代码中做更多的修改来处理这个问题。在
(顺便说一句,如果你只需要一个从XLS或CSV到Python数据的简单转换,
pandas
似乎是一个巨大的怪物。对于CSV,有一个本机Python库;虽然我不太清楚,但我现在还没有一个XLS的转换器。在相关问题 更多 >
编程相关推荐