python - python flask SQLAlchemy将数据插入mysql
问题描述
我想将测试数据插入到 mysql 用户表中。我第一次可以在python shell中添加数据,但是我不知道如何在新的shell环境中插入数据:
MariaDB [python]> select * from users;
+----+----------+---------+
| id | username | role_id |
+----+----------+---------+
| 1 | John | 1 |
| 2 | Mary | 2 |
| 3 | Terry | 3 |
| 4 | test_user| 1 | (I want insert 'test_user' into mysql like this)
MariaDB [python]> select * from roles;
+----+-----------+
| id | name |
+----+-----------+
| 1 | Admin |
| 2 | Moderator |
| 3 | User |
+----+-----------+
[root@docker1 namecard]# /root/namecard/bin/python3 manage.py shell
>>> admin_role = Role(name='Admin')
>>> user_test = User(username='test_user', role=admin_role)
>>> db.session.add(user_test)
>>> db.session.commit()
============================================================
Traceback (most recent call last):
File "/root/namecard/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 1 context)
... ...
sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'Admin' for key 'name'") [SQL: 'INSERT INTO roles (name) VALUES (%(name)s)'] [parameters: {'name': 'Admin'}] (Background on this error at: http://sqlalche.me/e/gkpj)
============================================================
我知道系统报重复输入Admin
错误,但不知道如何在python shell环境下向mysql表中插入数据。
这是我的models.py文件:
[root@docker1 namecard]# cat app/models.py
from . import db
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
users = db.relationship('User', backref='role', lazy='dynamic')
def __repr__(self):
return '<Role %r>' % self.name
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
def __repr__(self):
return '<User %r>' % self.username
解决方案
您的role
表已经有条目,Admin
因此您无需再次插入它。使用以下几行编辑您的manage.py
(或在 shell 中运行):
admin_role = db.session.query(Role).filter_by(name='Admin').first()
user_test = User(username='test_user', role_id=admin_role.id)
db.session.add(user_test)
db.session.commit()
推荐阅读
- docker - 'artifactory' 的 docker v2 存储库请求不受支持
- javascript - MongoDB 按文档参考查询
- c++ - 我该如何调用这个模板函数?
- python-3.x - 如何在不关闭检查的情况下避免出现“预期类型'int',改为'Series'”这样的消息?
- reactjs - 对graphql API的反应调用返回未定义
- mysql - 如何使用表中的“时间戳”列选择一个小时内“值”列的平均值
- android - 如何在 viewpaper 中仅添加按钮?
- javascript - 用Javascript生成随机足球比赛的算法
- javascript - 合并来自 Promise.all 和 map 的数组结果
- dynamic-programming - 返回从商店购买物品的最大奖励