2017-02-26 48 views
0

我有一个使用SQLAlchemy的应用程序,并且在使用SQLite时它工作正常。但是,当我转移到PostgreSQL时,我发现自己甚至无法进行合并。下面是我用我不能与合并项目表型号:SQLAlchemy + Postgres:“您可能需要在合并时添加显式类型转换”

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,但它是没有用的,错误依然存在。我该怎么做才能解决它?

+0

'priceindex'有什么价值?这是一个字符串? –

+0

@SergeyGornostaev不,它是一个整数。我将更新代码并显示我强制所有python类型转换。 – RomaValcer

+2

但列定义为字符串,所以它必须是字符串。 –

回答

2

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

相关问题