我有以下代码将JSON数据插入SQLite数据库:
# POST request here
if request.headers['Content-Type'] == 'application/json':
db = get_db()
db.execute('insert into places (lat, long, address, name) values (?, ?, ?, ?)', [request.data[0], request.data[1], request.data[2], request.data[3]])
db.commit()
并检索该数据:
# GET request here
if request.method == 'GET':
db = get_db()
cur = db.execute('select * from places order by id')
entries = [dict(id=row[0], lat=row[1], long=row[2], address=row[3], name=row[4]) for row in cur.fetchall()]
return repr(entries)
以及上面使用的get_db()
方法:
def get_db():
op = _app_ctx_stack.top
if not hasattr(top, 'sqlite_db'):
top.sqlite_db = sqlite3.connect(app.config['DATABASE'])
return top.sqlite_db
以下是我正在做的示例cURL请求:
curl -H "Content-type: application/json" -X POST http://127.0.0.1:5000/location -d '{'lat':5, 'long':10, 'address':'street', 'name':'work'}'
尝试执行GET
时如下:curl -X GET http://127.0.0.1:5000/location
,我得到:
[{'lat': u'{', 'address': u'a', 'id': 1, 'long': u'l', 'name': u't'}]
我认为这是一个编码问题。关于我应该如何存储数据以避免这种情况的任何建议?这究竟是什么问题?
谢谢!
答案 0 :(得分:0)
你可以尝试
repr(x).decode("utf-8") where x is your value
答案 1 :(得分:0)
以下代码是您要实现的功能的完整功能版本。有许多地方造成了问题。它们如下:
卷曲问题
您使用过单引号的json字符串,这是无效的json。 json字符串必须使用双引号。正确的电话应该是:
curl -H "Content-type: application/json" -X POST http://localhost:5000/location -d '{"lat":5, "long":10, "address":"street", "name":"work"}'
当我尝试解码json数据时,我在代码中遇到了这个问题,因为解码最初失败时它是无效的json。
插入数据问题
在您的代码中引用request.data[0]
,这实际上是您的json数据的第一个字符恰好是{
字符,这就是为什么您一直将其视为lat字段的值。在下面的代码中,request.data
被引用并反序列化为python字典。然后我们可以通过访问每个必需的字段来插入数据库行。要创建此代码中使用的数据库,您可以运行以下命令:
echo "CREATE TABLE places (id INTEGER PRIMARY KEY, lat text, long text, address text, name text);" | sqlite3 places.db
您访问http://127.0.0.1:5000/location
时获得的回复将是:
[(1, u'5', u'10', u'street', u'work')]
<强>码强>
from flask import Flask, request
import json, sqlite3
app = Flask(__name__)
@app.route('/location', methods=['GET', 'POST'])
def hello_world():
conn = sqlite3.connect("places.db")
cur = conn.cursor()
if request.method == 'GET':
cur.execute('SELECT * FROM places ORDER BY id')
return repr(cur.fetchall())
else:
d = json.loads(request.data)
row = (d['lat'], d['long'], d['address'], d['name'])
cur.execute("""INSERT INTO places (lat, long, address, name)
VALUES (?,?,?,?)""", row)
conn.commit()
return 'done\n'
app.run(debug=True)