2012-01-16 45 views
0

我正在使用PyQt和SQLAlchemy和SQLAlchemy不接受QStrings。有沒有辦法將QStrings傳遞給它,或者我必須每次都將QStrings轉換爲Python字符串?PyQt - SQLAlchemy不接受QString

謝謝。

下面的代碼:

import sip 
sip.setapi('QString', 2) 

from sqlalchemy import create_engine 
from sqlalchemy import Table, Column, Integer, String, Float, MetaData, ForeignKey 
from sqlalchemy.sql import select, and_ 
from PyQt4 import QtGui, QtCore 

class DbUtils(object): 
    def __init__(self, db_file = None, parent = None): 

     self.db = None 
     self.db_connection = None 
     self.db_file = str(db_file) 

    def db_open(self): 
     self.db = create_engine('sqlite:///' + self.db_file) 
     self.db_connection = self.db.connect() 

    def db_close(self): 
     self.db_connection.close() 

    def db_create_voltdrop(self): 
     metadata = MetaData() 

     tb_cable_brands = Table('cable_brands', metadata, 
      Column('id', Integer, primary_key=True), 
      Column('brand', String) 
      ) 
     tb_cable_types = Table('cable_types', metadata, 
      Column('id', Integer, primary_key=True), 
      Column('brand_id', None, ForeignKey('cable_brands.id')), 
      Column('type', String), 
      Column('alpha', String) 
      ) 
     tb_cable_data = Table('cable_data', metadata, 
      Column('id', Integer, primary_key=True), 
      Column('type_id', None, ForeignKey('cable_types.id')), 
      Column('size', String), 
      Column('resistance', Float) 
      ) 
     metadata.create_all(self.db) 

    def delete_cable_brand(self, cable_brand): 
     cable_brand = str(cable_brand) 
     metadata = MetaData() 
     metadata.bind = self.db 

     tb_cable_brands = Table('cable_brands', metadata, autoload = True) 

     cable_brands = select([tb_cable_brands.c.brand], 
          and_(tb_cable_brands.c.brand == cable_brand) 
         ) 
     row = self.db_connection.execute(cable_brands) 
     data = row.fetchone() 
     if str(data[0]) == cable_brand: 
      cable_brands = tb_cable_brands.delete().where(tb_cable_brands.c.brand == cable_brand) 
      self.db_connection.execute(cable_brands) 
      return True 
     else: 
      return False 
+0

你有兩個問題;請單獨詢問。 – 2012-01-16 08:26:02

回答

1

可以change the API to v2和PyQt的總是會使用常規的Python字符串,而不是QString秒。

編輯

案例1:沒有sip.setapi

import sys 
from PyQt4 import QtGui 

app = QtGui.QApplication(sys.argv) 
c = QtGui.QComboBox() 
c.addItems(["one","two"]) 
print c.currentText(), type(c.currentText()) 
c.show() 
sys.exit(app.exec_()) 

# Outputs 
one <class 'PyQt4.QtCore.QString'> 

案例2:隨着sip.setapi

import sip 
sip.setapi("QString",2) 

import sys 
from PyQt4 import QtGui 

app = QtGui.QApplication(sys.argv) 
c = QtGui.QComboBox() 
c.addItems(["one","two"]) 
print c.currentText(), type(c.currentText()) 
c.show() 
sys.exit(app.exec_()) 

# Outputs 
one <type 'unicode'> 
+0

如果我使用sip.setapi('QString',1),它說「AttributeError:'QString'對象沒有'get_dialect'屬性。如果我使用sip.setapi('QString',2),它表示「ValueError:API'QString'已經被設置爲版本1」。如果我不使用SIP並將QString轉換爲Python str(db_file),db = create_engine('sqlite:///'+ self.db_file),那麼一切正常。但我不想每次都將所有QStrings轉換爲str。 – linuxoid 2012-01-17 00:52:47

+0

@ user665327:您需要在*第一次導入PyQt4之前將API設置爲v2 *。如果你以後這樣做,你會得到這個錯誤。 – Avaris 2012-01-17 02:48:47

+0

我知道,我已經把它放在所有其他進口之上,並且仍然存在這些錯誤。 – linuxoid 2012-01-17 04:12:44