#common-lisp
#common-lisp
Вопрос:
Я боюсь задавать такого рода базовые вопросы.
Я хочу управлять конфигурацией базы данных с помощью ENV, но я получаю сообщение об ошибке.
Это мой код:
(defconfig :common
`(:databases ((:maindb :mysql
:database-name (uiop:getenv "DATABASE_NAME")
:host (uiop:getenv "DATABASE_HOST")
:port (uiop:getenv "DATABASE_PORT")
:username (uiop:getenv "DATABASE_USERNAME")
:password (uiop:getenv "DATABASE_PASSWORD")))))
Это ошибка sbcl:
1(GETENV DATABASE_HOST) is not a Lisp string or pointer.
2 [Condition of type SIMPLE-ERROR]
3
4Restarts:
5 0: [ABORT] abort thread (#<THREAD "hunchentoot-worker-127.0.0.1:57248" RUNNING {10026777C3}>)
6
7Backtrace:
8 0: ((:METHOD CFFI:TRANSLATE-TO-FOREIGN (T CFFI::FOREIGN-STRING-TYPE)) (UIOP/OS:GETENV "DATABASE_HOST") #<unused argument>) [fast-method]
9 Locals:
10 CFFI::OBJ = (UIOP/OS:GETENV "DATABASE_HOST")
11 1: (COM.HACKINGHAT.CL-MYSQL-SYSTEM::MYSQL-REAL-CONNECT #.(SB-SYS:INT-SAP #X7FFFE0015E50) (UIOP/OS:GETENV "DATABASE_HOST") (UIOP/OS:GETENV "DATABASE_USERNAME") (UIOP/OS:GETENV "DATABASE_PASSWORD") (UIOP/O..
12 Locals:
13 CLIENT-FLAG = 0
14 DATABASE = (UIOP/OS:GETENV "DATABASE_NAME")
15 HOST = (UIOP/OS:GETENV "DATABASE_HOST")
16 MYSQL = #.(SB-SYS:INT-SAP #X7FFFE0015E50)
17 PASSWORD = (UIOP/OS:GETENV "DATABASE_PASSWORD")
18 PORT = (UIOP/OS:GETENV "DATABASE_PORT")
19 UNIX-SOCKET = #.(SB-SYS:INT-SAP #X00000000)
20 USER = (UIOP/OS:GETENV "DATABASE_USERNAME")
21 2: ((:METHOD COM.HACKINGHAT.CL-MYSQL-SYSTEM::CONNECT-TO-SERVER (COM.HACKINGHAT.CL-MYSQL-SYSTEM:CONNECTION-POOL)) #<COM.HACKINGHAT.CL-MYSQL-SYSTEM:CONNECTION-POOL {1008B324F3}>) [fast-method]
Ответ №1:
Вам не хватает запятых перед частями, которые должны быть оценены:
(defconfig :common
`(:databases ((:maindb :mysql
:database-name ,(uiop:getenv "DATABASE_NAME")
:host ,(uiop:getenv "DATABASE_HOST")
:port ,(uiop:getenv "DATABASE_PORT")
:username ,(uiop:getenv "DATABASE_USERNAME")
:password ,(uiop:getenv "DATABASE_PASSWORD")))))