Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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 ';基本炼金术';导致重复条目IntegrityError的示例问题_Python_Sqlalchemy - Fatal编程技术网

Python ';基本炼金术';导致重复条目IntegrityError的示例问题

Python ';基本炼金术';导致重复条目IntegrityError的示例问题,python,sqlalchemy,Python,Sqlalchemy,我在书的帮助下学习炼金术 其中一个例子对我想学习的内容至关重要——添加相关对象。我就是不能让它工作。我希望这个社区能帮助我确定我是否遗漏了什么,或者这个例子中是否有缺陷。显然,前者是最有可能的。但是,不管怎样,我希望这可能对其他人有所帮助。对我来说,这本书在这个关键点之前一直感觉很直接 给出的示例来自第7章,麻烦的“订单”代码是示例7-25。完整的代码示例在 我从以下设置开始: from sqlalchemy import create_engine from sqlalchemy.orm im

我在书的帮助下学习炼金术

其中一个例子对我想学习的内容至关重要——添加相关对象。我就是不能让它工作。我希望这个社区能帮助我确定我是否遗漏了什么,或者这个例子中是否有缺陷。显然,前者是最有可能的。但是,不管怎样,我希望这可能对其他人有所帮助。对我来说,这本书在这个关键点之前一直感觉很直接

给出的示例来自第7章,麻烦的“订单”代码是示例7-25。完整的代码示例在

我从以下设置开始:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql+pymysql://root:password@localhost/Alberta', pool_recycle=3600)

Session = sessionmaker(bind=engine)

session = Session()

from datetime import datetime
from sqlalchemy import (Table, Column, Integer, Numeric, String, DateTime, ForeignKey, Boolean, desc, func)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref

Base = declarative_base()

class Cookie(Base):
    __tablename__ = 'cookies'
    cookie_id = Column(Integer, primary_key=True)
    cookie_name = Column(String(50), index=True)
    cookie_recipe_url = Column(String(255))
    cookie_sku = Column(String(55))
    quantity = Column(Integer())
    unit_cost = Column(Numeric(12, 2))

    def __repr__(self):
        return "Cookie(cookie_name='{self.cookie_name}', " \
                   "cookie_recipe_url='{self.cookie_recipe_url}', " \
                   "cookie_sku='{self.cookie_sku}', " \
                   "quantity={self.quantity}, " \
                   "unit_cost={self.unit_cost})".format(self=self)


class User(Base):
    __tablename__ = 'users'
    user_id = Column(Integer(), primary_key=True)
    username = Column(String(15), nullable=False, unique=True)
    email_address = Column(String(255), nullable=False)
    phone = Column(String(20), nullable=False)
    password = Column(String(25), nullable=False)
    created_on = Column(DateTime(), default=datetime.now)
    updated_on = Column(DateTime(), default=datetime.now, onupdate=datetime.now)

def __repr__(self):
    return "User(username='{self.username}', " \
                 "email_address='{self.email_address}', " \
                 "phone='{self.phone}', " \
                 "password='{self.password}')".format(self=self)

class Order(Base):
    __tablename__ = 'orders'
    order_id = Column(Integer(), primary_key=True)
    user_id = Column(Integer(), ForeignKey('users.user_id'))
    shipped = Column(Boolean(), default=False)

     user =  relationship("User", backref=backref('orders', order_by=order_id))

    def __repr__(self):
        return "Order(user_id={self.user_id}, " \
                  "shipped={self.shipped})".format(self=self)


class LineItem(Base):
    __tablename__ = 'line_items'
    line_item_id = Column(Integer(), primary_key=True)
    order_id = Column(Integer(), ForeignKey('orders.order_id'))
    cookie_id = Column(Integer(), ForeignKey('cookies.cookie_id'))
    quantity = Column(Integer())
    extended_cost = Column(Numeric(12, 2))

    order = relationship("Order", backref=backref('line_items', order_by=line_item_id))
    cookie = relationship("Cookie", uselist=False)

    def __repr__(self):
        return "LineItems(order_id={self.order_id}, " \
                      "cookie_id={self.cookie_id}, " \
                      "quantity={self.quantity}, " \
                      "extended_cost={self.extended_cost})".format(
                self=self)

Base.metadata.create_all(engine)
我成功运行了以下示例,使用用户名为cookiemon的用户填充数据库:

cookiemon = User(username='cookiemon',
    email_address='wellhithere@gmail.com',
    phone='416-555-1212',
    password='password'
    )

session.add(cookiemon)
session.commit()
现在,在本书的下一个示例中,我被告知以下代码可以工作

o1 = Order()
o1.user = cookiemon
session.add(o1)

cc = session.query(Cookie).filter(Cookie.cookie_name == "chocolate chip").one()
line1 = LineItem(cookie=cc, quantity=2, extended_cost=1.00)

pb = session.query(Cookie).filter(Cookie.cookie_name == 
                              "peanut butter").one()
line2 = LineItem(quantity=12, extended_cost=3.00)
line2.cookie = pb 
line2.order = o1

o1.line_items.append(line1)
o1.line_items.append(line2)
session.commit()
但是,由于数据库中已存在用户cookiemon,因此出现以下错误:

SQLalCerix.ExistItimeError:(由于查询调用的自动填充而引发;如果过早地出现这种刷新,请考虑使用SeaSn.NoAutoFLUP块)(PyySQL.Er.TimeIrror Error)(1062,U“重复键入的Ko''erNeNeM'”的CuiKiMon’)[SQL:U'插入用户(用户名、电子邮件地址、电话、密码、CREATETYON、UPDATEDY ON)值(%(用户名)s、%(电子邮件地址)s、%(电话)s、%(密码)s、%(创建日期)s、%(更新日期)s)][参数:{'username':'cookiemon'、'phone':'416-555-1212','created_on':datetime.datetime(2018,9,14,13,7,29,353673),'updated_on':datetime.datetime(2018,9,14,13,7,29,353701),“密码”:“密码ew”,“电子邮件地址”:wellhithere@gmail.com“}]

如果我先删除cookiemon用户的话,上面的订单代码就像一个符咒(这并不奇怪)。但在现实世界中,这很难奏效

我可以看到有一个解决方案没有自动刷新。但这有必要吗?或者我只是错过了一些简单但重要的东西

以下是回溯:

cd "/Users/chris/Desktop/Banff Experiments" ; env "PYTHONIOENCODING=UTF-8" "PYTHONUNBUFFERED=1" "PYTHONPATH=/Users/chris/.vscode/extensions/ms-python.python-2018.8.0/pythonFiles/experimental/ptvsd" "/Users/chris/Desktop/Banff Experiments/banff/bin/python" -m ptvsd --host localhost --port 59094 "/Users/chris/Desktop/Banff Experiments/workspace4.py"
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
 File "/Users/chris/.vscode/extensions/ms-python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/__main__.py", line 211, in <module>
singlesession=args.single_session)
 File "/Users/chris/.vscode/extensions/ms-python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/__main__.py", line 205, in main
debug_main(addr, name, kind, *extra, **kwargs)
 File "/Users/chris/.vscode/extensions/ms-python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_local.py", line 30, in debug_main
run_file(address, name, *extra, **kwargs)
 File "/Users/chris/.vscode/extensions/ms-python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_local.py", line 64, in run_file
run(argv, addr, **kwargs)
 File "/Users/chris/.vscode/extensions/ms-python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_local.py", line 125, in _run
_pydevd.main()
 File "/Users/chris/.vscode/extensions/ms-python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_vendored/pydevd/pydevd.py", line 1743, in main
debugger.connect(host, port)
 File "/Users/chris/.vscode/extensions/ms-python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_vendored/pydevd/pydevd.py", line 1099, in run
return self._exec(is_module, entry_point_fn, module_name, file, globals, locals)
 File "/Users/chris/.vscode/extensions/ms-python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_vendored/pydevd/pydevd.py", line 1106, in _exec
pydev_imports.execfile(file, globals, locals)  # execute the script
 File "/Users/chris/Desktop/Banff Experiments/workspace4.py", line 94, in <module>
session.commit()
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 943, in commit
self.transaction.commit()
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 467, in commit
self._prepare_impl()
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 447, in _prepare_impl
self.session.flush()
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 2254, in flush
self._flush(objects)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 2380, in _flush
transaction.rollback(_capture_exception=True)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__
compat.reraise(exc_type, exc_value, exc_tb)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 2344, in _flush
flush_context.execute()
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 391, in execute
rec.execute(self)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 556, in execute
uow
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 181, in save_obj
mapper, table, insert)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 866, in _emit_insert_statements
execute(statement, params)
File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 948, in execute
return meth(self, multiparams, params)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 269, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1060, in _execute_clauseelement
compiled_sql, distilled_params
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1200, in _execute_context
context)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1413, in _handle_dbapi_exception
exc_info
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 265, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb, cause=cause)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
context)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 509, in do_execute
cursor.execute(statement, parameters)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/pymysql/cursors.py", line 170, in execute
result = self._query(query)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/pymysql/cursors.py", line 328, in _query
conn.query(q)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/pymysql/connections.py", line 516, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/pymysql/connections.py", line 727, in _read_query_result
result.read()
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/pymysql/connections.py", line 1066, in read
first_packet = self.connection._read_packet()
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/pymysql/connections.py", line 683, in _read_packet
packet.check_error()
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/pymysql/protocol.py", line 220, in check_error
err.raise_mysql_exception(self._data)
 File "/Users/chris/Desktop/Banff Experiments/banff/lib/python2.7/site-packages/pymysql/err.py", line 109, in raise_mysql_exception
raise errorclass(errno, errval)
sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1062, u"Duplicate entry 'cookiemon' for key 'username'") [SQL: u'INSERT INTO users (username, email_address, phone, password, created_on, updated_on) VALUES (%(username)s, %(email_address)s, %(phone)s, %(password)s, %(created_on)s, %(updated_on)s)'] [parameters: {'username': 'cookiemon', 'phone': '416-555-1212', 'created_on': datetime.datetime(2018, 9, 14, 13, 44, 46, 916687), 'updated_on': datetime.datetime(2018, 9, 14, 13, 44, 46, 916712), 'password': 'passwordEW', 'email_address': 'wellhithere@gmail.com'}] (Background on this error at: http://sqlalche.me/e/gkpj)
cd”/Users/chris/Desktop/Banff实验”;env“PythonionEncoding=UTF-8”“PYTHONUNBUFFERED=1”“PYTHONPATH=/Users/chris/.vscode/extensions/ms python.python-2018.8.0/pythonFiles/experimental/ptvsd”“/Users/chris/Desktop/Banff-Experiments/Banff/bin/python“--m ptvsd——主机本地主机——端口59094”/Users/chris/Desktop/Desktop/Banff-Experiments/workspace4.py”
回溯(最近一次呼叫最后一次):
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py”,第162行,在运行模块中
“\uuuuu main\uuuuuuuuuuuuuuuuuuuuuuuuu”,fname,loader,pkg\u name)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py”,第72行,在运行代码中
run_globals中的exec代码
文件“/Users/chris/.vscode/extensions/ms python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_main__.py”,第211行,在
singlesession=args.single_session)
文件“/Users/chris/.vscode/extensions/ms python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_main__.py”,第205行,在main中
debug_main(地址、名称、种类、*extra、**kwargs)
文件“/Users/chris/.vscode/extensions/ms python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_local.py”,第30行,在debug_main中
运行文件(地址、名称、*extra、**kwargs)
文件“/Users/chris/.vscode/extensions/ms python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_local.py”,第64行,在run_文件中
运行(argv,addr,**kwargs)
文件“/Users/chris/.vscode/extensions/ms python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_local.py”,第125行,正在运行
_pydevd.main()
文件“/Users/chris/.vscode/extensions/ms python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_vendored/pydevd/pydevd.py”,主文件第1743行
调试器.connect(主机、端口)
文件“/Users/chris/.vscode/extensions/ms python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_vendored/pydevd/pydevd.py”,第1099行,正在运行
返回self.\u exec(是模块、入口点、模块名称、文件、全局、局部)
文件“/Users/chris/.vscode/extensions/ms python.python-2018.8.0/pythonFiles/experimental/ptvsd/ptvsd/_vendored/pydevd/pydevd.py”,第1106行,在_exec中
pydev_imports.execfile(文件、全局、局部)#执行脚本
文件“/Users/chris/Desktop/Banff-Experiments/workspace4.py”,第94行,在
session.commit()
提交中的文件“/Users/chris/Desktop/Banff-Experiments/Banff/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,第943行
self.transaction.commit()
提交文件“/Users/chris/Desktop/Banff-Experiments/Banff/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,第467行
self.\u prepare\u impl()
文件“/Users/chris/Desktop/Banff-Experiments/Banff/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,第447行,在
self.session.flush()
文件“/Users/chris/Desktop/Banff-Experiments/Banff/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,第2254行,刷新
自冲洗(对象)
文件“/Users/chris/Desktop/Banff-Experiments/Banff/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,第2380行,在
事务.rollback(\u capture\u exception=True)
文件“/Users/chris/Desktop/Banff-Experiments/Banff/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py”,第66行,在退出时__
兼容性(exc_类型、exc_值、exc_tb)
文件“/Users/chris/Desktop/Banff-Experiments/Banff/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,第2344行,在
flush_context.execute()
文件“/Users/chris/Desktop/Banff-Experiments/Banff/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py”,第391行,在execute中
rec.execute(self)
文件“/Users/chris/Desktop/Banff-Experiments/Banff/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py”,第556行,在execute中
uow
文件“/Users/chris/Desktop/Banff-Experiments/Banff/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py”,第181行,在save_-obj中
映射器、表、插入)
文件“/Users/chris/Desktop/Banff-Experiments/Banff/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py”,第866行,在
cookiemon = User(username='cookiemon',
    email_address='wellhithere@gmail.com',
    phone='416-555-1212',
    password='password'
    )

session.add(cookiemon)
session.commit()
cookiemon = session.query(User).filter(User.username=='cookiemon').one()
# try to get the user from the databae
cookiemon = session.query(User).filter(User.username=='cookiemon').first()
if cookiemon is None: # not found, create new one:
    cookiemon = User(
        username='cookiemon',
        email_address='wellhithere@gmail.com',
        phone='416-555-1212',
        password='password'
    )
    session.add(cookiemon)
    session.commit()