Py学习  »  Denis Otkidach  »  全部回复
回复总数  2
15 年前
回复了 Denis Otkidach 创建的主题 » 最令人沮丧的python黑客是什么?

过度使用 from module import * .

在模块中有很多这样的导入,您不知道每个变量来自何处,必须查看所有导入的模块。在这种情况下,搜索没有多大帮助。

15 年前
回复了 Denis Otkidach 创建的主题 » python中的copy和deepcopy帮助

这是另一种选择,但我不确定它是否适用于您的问题:

  1. 从数据库中检索对象以及所有需要的关系。你也可以通过 lazy='joined' lazy='subquery' 关系或电话 options(eagerload(relation_property) 查询方法,或者只访问触发其加载所需的属性。
  2. 从会话中删除对象。此时将不支持延迟加载对象属性。
  3. 现在您可以安全地修改对象了。
  4. 当需要更新数据库中的对象时,必须将其合并回会话并提交。

更新 :这里是概念代码示例的证明:

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relation, eagerload

metadata  = MetaData()
Base = declarative_base(metadata=metadata, name='Base')

class Project(Base):
    __tablename__ = 'projects'
    id = Column(Integer, primary_key=True)
    name = Column(String)


class Student(Base):
    __tablename__ = 'students'
    id = Column(Integer, primary_key=True)
    project_id = Column(ForeignKey(Project.id))
    project = relation(Project,
                       cascade='save-update, expunge, merge',
                       lazy='joined')

engine = create_engine('sqlite://', echo=True)
metadata.create_all(engine)
session = sessionmaker(bind=engine)()

proj = Project(name='a')
stud = Student(project=proj)
session.add(stud)
session.commit()
session.expunge_all()
assert session.query(Project.name).all()==[('a',)]

stud = session.query(Student).first()
# Use options() method if you didn't specify lazy for relations:
#stud = session.query(Student).options(eagerload(Student.project)).first()
session.expunge(stud)

assert stud not in session
assert stud.project not in session

stud.project.name = 'b'
session.commit() # Stores nothing
assert session.query(Project.name).all()==[('a',)]

stud = session.merge(stud)
session.commit()
assert session.query(Project.name).all()==[('b',)]