小编Ale*_*xei的帖子

SQLAlchemy多态关联

我尝试通过SQLAlchemy库实现多态关联,并使用它作为示例:

discriminator_on_association.

但是与我的案件存在一种不相容之处.在示例中:创建地址对象,然后将它们添加到供应商或客户(因此,地址表具有供应商和客户表的多态外键以及供应商和客户对象返回地址).当Address对象添加到这些表时,SQLAlchemy会自动解决如何在表上分配Id的问题.然后可以使用地址的"父"字段获取供应商或客户对象.

虽然在我的情况下我需要首先创建Address对象然后将地址分配给父对象(例如公司,例如它是供应商和客户).

与我的情况一样使用多态关联的示例:

engine = create_engine('sqlite://', echo=True)
Base.metadata.create_all(engine)

session = Session(engine)

address = Address(street='2569 west elm', city="Detroit", zip="56785")

cust = Customer(name="Tester")
supl = Supplier(company_name="Ace Hammers")

address.parent = supl

session.add_all([address])

session.commit()
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试将此模式应用于我的案例而不进行修改,我会收到下一条错误消息:

Traceback (most recent call last):
  File "discriminator_on_related.py", line 131, in 
    address.parent = supl
  File "C:\Python27\lib\site-packages\sqlalchemy-0.9.3-py2.7-win32.egg\sqlalchemy\ext\associationproxy.py", line 271, in __set__
    setattr(obj, self.target_collection, creator(values))
TypeError: __init__() takes exactly 1 argument (2 given)

我该如何修改这个模式才能使它有效?

PS对不起,如果这是一个微不足道的问题(SQLAlchemy association_proxy对我来说看起来像某种神奇的东西).

python sqlalchemy polymorphic-associations

8
推荐指数
1
解决办法
5584
查看次数

lambda参数解包错误

在Python 2中,这段代码没问题:

f = lambda (m, k): m + k

m = [1,2,3,4]
k = [5,6,7,8]

print(map(f, zip(m, k)))
Run Code Online (Sandbox Code Playgroud)

但是在Python 3中发生了以下错误:

f = lambda (m, k): m + k
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

如果我删除lambda表达式中的括号,则会发生另一个错误:

TypeError: <lambda>() missing 1 required positional argument: 'k'
Run Code Online (Sandbox Code Playgroud)

使用元组作为单个lambda参数的方法也适用于Python 3,但它不清楚(难以阅读):

f = lambda args: args[0] + args[1]
Run Code Online (Sandbox Code Playgroud)

如何在Python 3中以正确的方式解压缩值?

python lambda tuples unpack python-3.x

8
推荐指数
3
解决办法
2867
查看次数

AddressSanitizer:boost cpp_int 上的堆栈缓冲区溢出

我有以下应该转换std::array<uint8_t>BigIntie 的代码示例boost::multiprecision::cpp_int。我使用 MSYS2 中的 clang64 15.0.7 (\xd0\xa1++17) 编译此代码。代码工作正常并将 uint8_t 数组转换为 BigInt。

\n
#include <string>\n#include <iostream>\n#include <boost/multiprecision/cpp_int.hpp>\n\nusing BigInt = boost::multiprecision::cpp_int;\n\nconst auto b = std::array<uint8_t, 16>{\n    0x11, 0x22, 0x33, 0x44,\n    0x11, 0x22, 0x33, 0x44,\n    0x11, 0x22, 0x33, 0x44,\n    0x11, 0x22, 0x33, 0x44\n};\n\nint main() {\n    size_t shift = 0;\n    auto initial = BigInt{};\n\n    auto i = std::accumulate(\n            b.cbegin(),\n            b.cend(),\n            initial,\n            [&shift](const BigInt &acc, uint8_t it) {\n                auto byte = BigInt{it};\n                auto result = acc | (byte << …
Run Code Online (Sandbox Code Playgroud)

c++ gcc boost clang bigint

7
推荐指数
1
解决办法
535
查看次数

sqlalchemy:如何阻止特定列的更新

我有一个声明性映射:

class User(base):
    username = Column(Unicode(30), unique=True)
Run Code Online (Sandbox Code Playgroud)

我怎么能告诉 sqlalchemy 这个属性不能被修改?我想出的解决方法有点笨拙:

from werkzeug.utils import cached_property
# regular @property works, too

class User(base):
    _username = Column('username', Unicode(30), unique=True)
    @cached_property
    def username(self):
        return self._username
    def __init__(self, username, **kw):
        super(User,self).__init__(**kw)
        self._username=username
Run Code Online (Sandbox Code Playgroud)

在数据库列权限级别上执行此操作将不起作用,因为并非所有数据库都支持该操作。

sqlalchemy

5
推荐指数
2
解决办法
2331
查看次数

Python SQLAlchemy 关系设置事件钩子

在 SQLAlchemy ORM 中,可以使用以下代码挂钩所有表和列的属性设置事件:

@event.listens_for(Base, 'attribute_instrument')
def configure_listener(class_, key, inst):    
    if not hasattr(inst.property, 'columns'):
        return

    @event.listens_for(inst, "set", retval=True)
    def set_column_value(instance, value, oldvalue, initiator):
        column = inst.property.columns[0]
        # HOOK CODE
        logging.info("%s: %s -> %s" % (inst.property.columns[0], oldvalue, value))
        return value 
Run Code Online (Sandbox Code Playgroud)

但这种方法并不适合人际关系。作为关系的表属性不会经过此事件,而官方指南没有说明该关系的属性不会被事件处理。那么问题来了:SQLAlchemy 有什么方法可以挂钩事件并结合关系属性修改吗?

备注:我希望因为通过外键列与其他表链接的关系,然后修改此(外键)列将生成一个事件,但我错了:只有当记录已经具有有效的 Id 时才是 true,否则(当对象尚未添加到数据库)此事件未引发。

python orm sqlalchemy

5
推荐指数
1
解决办法
956
查看次数