2015-07-13 2 views
0

Я смотрел несколько видеороликов и читал разные сообщения, чтобы попытаться понять основную структуру SQLAlchemy в сценарии python.Python SQLAlchemy Основная структура

Может кто-нибудь сказать мне:

  1. Почему ниже скрипт не

Сценарий:

from sqlalchemy import * 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class Records(Base): 
    __tablename__ = 'records' 

    data1 = Column(Text()) 
    data2 = Column(Text()) 
    data3 = Column(Text()) 
    data4 = Column(Text()) 



if __name__ == "__main__": 
    engine = create_engine('mysql://user:[email protected]/database') 
    Base.metadata.create_all(bind=engine, checkfirst=True) 

Это терпит неудачу с

Traceback (most recent call last): 
    File "sqltest.py", line 6, in <module> 
    class Records(Base): 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/ext/declarative/api.py", line 55, in __init__ 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/ext/declarative/base.py", line 88, in _as_declarative 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/ext/declarative/base.py", line 103, in setup_mapping 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/ext/declarative/base.py", line 135, in __init__ 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/ext/declarative/base.py", line 138, in _early_mapping 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/ext/declarative/base.py", line 530, in map 
    File "<string>", line 2, in mapper 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/orm/mapper.py", line 629, in __init__ 
    File "build/bdist.linux-x86_64/egg/sqlalchemy/orm/mapper.py", line 1223, in _configure_pks 
sqlalchemy.exc.ArgumentError: Mapper Mapper|Records|records could not assemble any primary key columns for mapped table 'records' 

Я вынужден использовать первичный ключ? Или это связано с тем, как я называю класс Records?

ответ

1

Как указано в сообщении об ошибке, первичный ключ является обязательным. Нет причин не иметь их в любом случае, иначе вы не сможете выразить какие-либо связи в таблице.

В ответ на ваш комментарий: Если вы полагаетесь на использование существующей схемы базы данных, которая испытывает недостаток первичных ключей вы можете попробовать, что такое zzzeek (автор SQLAlchemy) предложил в своем комментарии к этому вопросу: SQLAlchemy declarative: table without any primary keys?, таким образом, использовать, например,

__mapper_args__ = {"primary_key":(data1, data2)}} 

if (data1, data2) идентифицирует строку таблицы. И должен быть способ идентифицировать таблицу в строке таблицы, иначе у вас будет серьезная проблема с дизайном.

+0

Как я могу двигаться вперед без основного ключа для этой таблицы? –

0

Спасибо нунуру, я переместил класс в этот класс primary_key и указав, что столбец data1 будет строкой длиной 17 для того, чтобы она была первичным ключом.

from sqlalchemy import * 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class Records(Base): 
    __tablename__ = 'records' 

    data1 = Column(String(17), primary_key=True) 
    data2 = Column(Text()) 
    data3 = Column(Text()) 
    data4 = Column(Text()) 

if __name__ == "__main__": 
    engine = create_engine('mysql://user:[email protected]/database') 
    Base.metadata.create_all(bind=engine, checkfirst=True) 
+0

Хорошо, это интересно. Я не знал, что текстовые столбцы не могут быть первичными. Вероятно, это связано с их переменной длиной и что они хранятся не в фактической таблице, а внешне. Если у вас есть это в руке, я все равно ручаюсь за целочисленный первичный ключ. – nucleon

+0

переход к целому числу невозможен. Поле data1 содержит mac_addresses в формате A1: B2: C3: D4: E5. Спасибо за руководство. –

Смежные вопросы