Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 炼金术中的多对多关系_Python_Sql_Flask_Relational Database_Flask Sqlalchemy - Fatal编程技术网

Python 炼金术中的多对多关系

Python 炼金术中的多对多关系,python,sql,flask,relational-database,flask-sqlalchemy,Python,Sql,Flask,Relational Database,Flask Sqlalchemy,我刚从MySQL切换到SQLalchemy,我不得不说,要想了解SQLalchemy比我想象的要困难得多。目前,我在多对多关系中遇到了一些麻烦。我的模型中有用户和查询。一个用户可以有许多查询,一个查询每天提供一篇新文章供阅读。我想存储哪个用户在哪个日期读取哪个查询。我的models.py看起来像这样 class User(db.Model): id = db.Column(db.Integer, primary_key=True) read_dates = db.relatio

我刚从MySQL切换到SQLalchemy,我不得不说,要想了解SQLalchemy比我想象的要困难得多。目前,我在多对多关系中遇到了一些麻烦。我的模型中有用户和查询。一个用户可以有许多查询,一个查询每天提供一篇新文章供阅读。我想存储哪个用户在哪个日期读取哪个查询。我的models.py看起来像这样

class User(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    read_dates = db.relationship("ReadIndex", backref="user")

    def __repr__(self):
        return '<User %r>' % (self.id)

class Queries(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __repr__(self):
        return '<Queries %r>' % (self.id)


class ReadIndex(db.Model):

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    query_id = db.Column(db.Integer, db.ForeignKey('queries.id'), primary_key=True)
    read_datetime = db.Column(db.DateTime)
    read_query = db.relationship("Queries", backref="user_assocs")

    def __repr__(self):
        return '<ReadIndex>'
其中query_id和user_id是选择我的对象的对应id。如果我运行这个,我会得到一个错误

sqlalchemy.exc.IntegrityError
IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed:
read_index.query_id [SQL: u'INSERT INTO read_index (user_id, read_datetime) 
VALUES (?, ?)'] [parameters: (1, '2015-07-29 20:55:50.898366')]
我不确定是什么问题?我似乎没有违反任何不为空的规定

编辑:我注意到我为a.read\u查询分配了query=None。更正此错误会稍微改变错误

IntegrityError: (raised as a result of Query-invoked autoflush;  
consider using a session.no_autoflush block if this flush is occurring prematurely) 
(sqlite3.IntegrityError) NOT NULL constraint failed: read_index.user_id 
[SQL: u'INSERT INTO read_index (query_id, read_datetime) VALUES (?, ?)'] 
[parameters: (1, '2015-07-29 23:11:11.934038')]
下面就是发生的情况:

>>> from app import app, db, models
>>> user = models.User.query.filter_by(id=1).first()
>>> user
<User u'Florian Beutler'>
>>> query = models.Queries.query.filter_by(id=1).first()
>>> query
<Queries 1>
>>> import datetime
>>> a = models.ReadIndex(read_datetime=datetime.datetime.utcnow())
>>> a.read_query = query
>>> user.read_dates.append(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-    packages/sqlalchemy/orm/attributes.py", line 237, in __get__
    return self.impl.get(instance_state(instance), dict_)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 578, in get
    value = self.callable_(state, passive)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/strategies.py", line 529, in _load_for_state
    return self._emit_lazyload(session, state, ident_key, passive)
  File "<string>", line 1, in <lambda>
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/strategies.py", line 599, in _emit_lazyload
    result = q.all()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2399, in all
    return list(self)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2515, in __iter__
    self.session._autoflush()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1292, in _autoflush
    util.raise_from_cause(e)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 199, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1282, in _autoflush
    self.flush()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 2004, in flush
    self._flush(objects)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 2122, in _flush
    transaction.rollback(_capture_exception=True)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 60, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 2086, in _flush
    flush_context.execute()
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 373, in execute
    rec.execute(self)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 532, in execute
    uow
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 174, in save_obj
mapper, table, insert)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 781, in _emit_insert_statements
    execute(statement, params)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 914, in execute
    return meth(self, multiparams, params)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1010, in _execute_clauseelement
    compiled_sql, distilled_params
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1146, in _execute_context
    context)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1341, in _handle_dbapi_exception
    exc_info
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 199, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1139, in _execute_context
    context)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 450, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.IntegrityError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely) (sqlite3.IntegrityError) NOT NULL constraint failed: read_index.user_id [SQL: u'INSERT INTO read_index (query_id, read_datetime) VALUES (?, ?)'] [parameters: (1, '2015-07-29 23:17:06.013485')]
>>从应用程序导入应用程序、数据库、模型
>>>user=models.user.query.filter\u by(id=1.first())
>>>使用者
>>>query=models.querys.query.filter_by(id=1).first()
>>>质疑
>>>导入日期时间
>>>a=models.ReadIndex(read\u datetime=datetime.datetime.utcnow())
>>>a.read\u query=查询
>>>user.read\u dates.append(a)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py”,第237行,在__
返回self.impl.get(实例\状态(实例),dict\状态)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/orm/attributes.py”,get中第578行
value=self.callable(状态,被动)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/orm/strategies.py”,第529行,处于“加载”状态
返回self.\u emit\u lazyload(会话、状态、标识键、被动)
文件“”,第1行,在
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/orm/strategies.py”,第599行,在_emit_lazyload中
结果=q.all()
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/orm/query.py”,第2399行,共
返回列表(自我)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/orm/query.py”,第2515行,在__
self.session.\u autoflush()
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/orm/session.py”,第1292行,在自动刷新中
util.raise_from_cause(e)
文件“/usr/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py”,第199行,在raise\u from\u cause中
重新释放(类型(异常),异常,tb=exc_tb)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/orm/session.py”,第1282行,在自动刷新中
self.flush()
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/orm/session.py”,第2004行,刷新
自冲洗(对象)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/orm/session.py”,第2122行,在\u flush中
事务.rollback(\u capture\u exception=True)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/util/langhelpers.py”,第60行,在__
兼容性(exc_类型、exc_值、exc_tb)
文件“/usr/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,第2086行,in\u-flush
flush_context.execute()
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/orm/unitofwork.py”,执行中第373行
rec.execute(self)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/orm/unitofwork.py”,执行中的第532行
uow
save_obj中的文件“/usr/local/lib/python2.7/site packages/sqlalchemy/orm/persistence.py”,第174行
映射器、表、插入)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/orm/persistence.py”,第781行,在emit\uinsert\u语句中
执行(语句,参数)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/engine/base.py”,执行中的第914行
返回方法(自身、多线程、参数)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/sql/elements.py”,第323行,在连接上执行
返回连接。_execute_clauseelement(self、multiparams、params)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/engine/base.py”,第1010行,在执行子句元素中
编译的sql,提取的参数
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/engine/base.py”,第1146行,在执行上下文中
(上下文)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/engine/base.py”,第1341行,在_handle_dbapi_exception中
exc_信息
文件“/usr/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py”,第199行,在raise\u from\u cause中
重新释放(类型(异常),异常,tb=exc_tb)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/engine/base.py”,第1139行,在执行上下文中
(上下文)
文件“/usr/local/lib/python2.7/site packages/sqlalchemy/engine/default.py”,第450行,在do_execute中
cursor.execute(语句、参数)
SQLalCerix.ExistItimeError:(作为查询调用的自动填充而引发的;如果过早发生此刷新,请考虑使用SESSION.NOSAutoFLUP块)(SQLe3.3.TimeIrror Error)而不是NULL约束失败:Read OnthyX.USSerIDID[SQL:U'插入到Read ObjyType(QuerySuthID,Read StureTimes)值((?))] [参数:(1, '2015-07-29 23:17:06.013485')]
约束? 谢谢
卡尔方法返回第一个结果或
None
如果没有,是否确定没有将
a.read\u query
分配给
None

出现此错误是因为ReadIndex表的user\u id和query\u id字段为None。因此,在提交时,ReadIndex对象试图在没有ha的情况下创建在主键字段中保存值。所以,执行此操作

user = models.User.query.filter_by(id=user_id).first()
query = models.Queries.query.filter_by(id=query_id).first()
a=models.ReadIndex(user_id=user.id,query_id=query.id,read_datetime=dt.utcnow())
db.session.add(a)
db.session.commit()
您不需要手动向关系添加任何内容。SQLAlchemy会自动为您添加内容。如果需要,您可以进行交叉检查

for ud in user.read_dates:
    print(ud)

希望这有帮助!

Hi fish,谢谢你的回复。事实上,我最初没有分配任何任务,但纠正这一点并没有解决问题。我更新了上面的帖子以说明我的意思
for ud in user.read_dates:
    print(ud)