Дължината на полето на базата данни не се прилага

Използвам web2py (python) с база данни sqlite3 (база данни за тестване на цветя :)). Ето декларацията на таблицата:

db.define_table('flower',
        Field('code', type='string', length=4, required=True, unique=True),
        Field('name', type='string', length=100, required=True),
        Field('description', type='string', length=250, required=False),
        Field('price',  type='float', required=True),
        Field('photo', 'upload'));

Което се превежда в правилен SQL в sql.log:

CREATE TABLE flower(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    code CHAR(4),
    name CHAR(200),
    description CHAR(250),
    price CHAR(5),
    photo CHAR(512)
);

Но когато вмъкна стойност на полето "код", която е по-голяма от 4 символа, тя все още се вмъква. Опитах да задам CHAR(10) (прост тест, предполагам) със същия резултат.

>>>db.flower.insert(code="123456789999", name="flower2", description="test flower 2", price="5.00");
>>>1L;

Същият проблем се отнася за всички полета, където задавам дължината. Опитах също валидиране (въпреки че не съм 100% в правилното му използване). Това също е в цветния модел flowers.py, където таблицата е дефинирана и следва декларацията на таблицата:

db.flower.code.requires = [ IS_NOT_EMPTY(), IS_LENGTH(4), IS_NOT_IN_DB(db, 'flower.code')]

Документация за това е тук, но не мога да намеря нищо, което ограничава проверката на дължината на SQLite3 или web2py на низа. Очаквам да видя грешка при вмъкване.

Бихте ли оценили малко помощ по този въпрос? Какво съм пропуснал в документацията? Използвах symphony2 с PHP и MySQL преди и бих очаквал подобно поведение тук.


person Serge Poele    schedule 21.06.2015    source източник


Отговори (2)


SQLite не е като другите бази данни. За всички (повечето) практически цели колоните не са типизирани и INSERT винаги ще успеят и няма да загубят данни или прецизност (което означава, че можете да ВМЪКНЕТЕ текстова стойност в REAL поле, ако желаете).

Декларираният тип на колоната се използва за система, наречена „афинитет към типа“, която е описана тук: https://www.sqlite.org/datatype3.html.

След като свикнете с него, това е някак забавно - но определено не е това, което бихте очаквали!

Трябва да извършите проверка на дължината във вашия код, преди да издадете INSERT.

person Larry Lustig    schedule 21.06.2015
comment
Благодаря ти Лари. И както казах под отговора на Антъни: жалко, че не мога да приема и двете. Ще напиша някои проверки преди вмъкване, за да наложа дължината. хубаво! - person Serge Poele; 21.06.2015

Както вече споменахме, SQLite не налага декларации за дължина на символно поле (вижте https://www.sqlite.org/faq.html#q9). Освен това IS_LENGTH валидаторът се прилага само ако направите вмъкването чрез SQLFORM подаване или чрез .validate_and_insert метода -- ако използвате само .insert метода, валидаторите, съхранени в requires атрибута, не се прилагат, така че няма да получите грешка.

person Anthony    schedule 21.06.2015
comment
Благодаря ти Антъни. Жалко, че не мога да направя и двата отговора приети, защото те чудесно се допълват. Това има смисъл и ви благодаря за препратката към sqlite често задавани въпроси. - person Serge Poele; 21.06.2015