【问题标题】:SQLAlchemy + Postgres: "You might need to add explicit type casts" on mergeSQLAlchemy + Postgres:“您可能需要在合并时添加显式类型转换”
【发布时间】:2017-07-16 20:45:58
【问题描述】:

我有一个使用 SQLAlchemy 的应用程序,当我使用 SQLite 时它运行良好。但是,当我迁移到 PostgreSQL 时,我发现自己甚至无法进行合并。这是我用于无法合并项目的表的模型:

class Item(db.Model):
    __tablename__ = "prices"
    defindex = db.Column(db.Integer, primary_key=True)
    quality = db.Column(db.Integer, primary_key=True)
    craftable = db.Column(db.Boolean, primary_key=True)
    tradeable = db.Column(db.Boolean, primary_key=True)
    item_metadata = db.Column(db.String(70), primary_key=True)
    name = db.Column(db.String(70), primary_key=True)
    currency = db.Column(db.String(70))
    price = db.Column(db.Float)
    price_high = db.Column(db.Float)

这就是我尝试合并的方式(假设所有变量都分配了正确的值):

    new_item = Item(defindex=int(defindex), quality=int(quality), craftable=bool(is_craft),
                tradeable=bool(is_trade), item_metadata=int(priceindex), currency=str(currency),
                price=float(price), price_high=float(price), name=str(name))

但是在这个调用中,我得到一个错误:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) operator does not exist: character varying = integer
LINE 3: ... prices.tradeable = true AND prices.item_metadata = 0 AND pr...
                                                         ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
[SQL: 'SELECT prices.defindex AS prices_defindex, prices.quality AS prices_quality, prices.craftable AS prices_craftable, prices.tradeable AS prices_tradeable, prices.item_metadata AS prices_item_metadata, prices.name AS prices_name, prices.currency AS prices_currency, prices.price AS prices_price, prices.price_high AS prices_price_high \nFROM prices \nWHERE prices.defindex = %(param_1)s AND prices.quality = %(param_2)s AND prices.craftable = %(param_3)s AND prices.tradeable = %(param_4)s AND prices.item_metadata = %(param_5)s AND prices.name = %(param_6)s'] [parameters: {'param_1': 1067, 'param_3': True, 'param_6': 'Grandmaster', 'param_5': 0, 'param_4': True, 'param_2': 1}]

我尝试在创建new_item 时添加所有类型转换,但没有用,错误仍然存​​在。我应该怎么做才能解决它?

【问题讨论】:

  • priceindex 有什么价值?这是一个字符串吗?
  • @SergeyGornostaev 不,它是一个整数。我将更新代码并显示我强制所有 python 类型转换。
  • 但是列定义为字符串,所以必须是字符串。
  • @SergeyGornostaev 如果您将此作为答案,我很乐意将其标记为正确。

标签: postgresql python-3.x sqlalchemy


【解决方案1】:

item_metadata定义为字符串,所以它必须是字符串。使用 SQLite 它可以工作,因为SQLite uses dynamic typing。它不强制执行数据类型约束。任何类型的数据都可以(通常)插入到任何列中。

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 2017-06-28
    • 2015-04-07
    • 2020-06-16
    • 2013-09-09
    • 2018-11-08
    • 1970-01-01
    • 2017-08-31
    • 2021-02-05
    相关资源
    最近更新 更多